poj 1874 畅通工程续
bellman-ford
算法解决的是一般情况下的单源最短路径问题,其边可以为负值。bellman-ford算法可以判断图是否存在负环,若存在负环会返回一个布尔值。当然在没有负环存在的情况下会返回所求的最短路径的值。
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define INF 0x3f3f3f #define N 11110 int dis[N]; int s,t,m,n; struct point { int u,v,w; }p[N]; void bellman() { dis[s] = 0;///源点初始化为0 m = m<<1;///相当于m*2,因为是无向图 for(int i=1;i<n;i++)///进行|v-1|次 { int f = 0; for(int j=0;j<m;j++) { if(dis[p[j].u]>dis[p[j].v]+p[j].w)///松弛处理 { dis[p[j].u]=dis[p[j].v]+p[j].w; f = 1;///松弛成功标记 } } if(!f)///对所有的边都没有进行松弛的话直接跳出 break; } printf("%d\n",dis[t]==INF?-1:dis[t]); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { fill(dis,dis+N,INF); for(int i=0;i<m;i++) { scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w); p[i+m].v = p[i].u; p[i+m].u = p[i].v; p[i+m].w = p[i].w; } scanf("%d%d",&s,&t); bellman(); } return 0; }