负权边最短路

mac2022-06-30  22

#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=510, M=10010; int n,m,k; int dist[N],backup[N]; struct edge { int a,b,w; }edges[M]; int bellman_ford() { memset(dist, 0x3f, sizeof dist); dist[1]=0; for(int i=0;i<k;i++) { memcpy(backup, dist, sizeof dist);//这里要做的是将dist的值做备份,所以用memcpy将值拷贝到backup中 for(int j=0;j<m;j++)//这里循环的是所有的边m { int a=edges[j].a, b=edges[j].b, w=edges[j].w; dist[b]=min(dist[b], backup[a]+w);//易错点①:这里一定是用节点的上一轮备份来进行更新,否则无法满足k的限制 } } if(dist[n] > 0x3f3f3f3f / 2 ) return -1; return dist[n]; } int main() { cin>>n>>m>>k; for(int i=0;i<m;i++) { int a,b,w; cin>>a>>b>>w; edges[i]={a,b,w}; } int t=bellman_ford(); if(t==-1) cout<<"impossible"<<endl; else cout<<t<<endl; return 0; }

 

最新回复(0)