Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
半年之后再看这道题,感觉果然不一样……In Reply To:关于Bellman-Ford算法的bug Posted by:Ruby931031 at 2012-03-21 17:49:36 //只要加一个超级源点0连接到各个顶点且权值为0就好了。。半年时间,天差地别。 //使用链式前向星+Bellman-Ford,时间短了一半还多!! //3259 Accepted 464K 360MS G++ 1471B 2012-07-12 00:34:41 //3259 Accepted 1172K 891MS C++ 1047B 2012-03-21 17:24:07 #include <stdio.h> #include <string.h> #define MAXN 800 #define MAXM 3000 #define INF (1<<30) struct Edge{ int to,next,w; } edge[MAXM<<1]; int head[MAXN],dist[MAXN],n,m,w; bool BellmanFord(){ int i,j,k; for (i=1; i<=n; ++i) dist[i]=INF; dist[0]=0; for (i=1; i<n; ++i) //松弛n-1轮 for (j=0;j<=n; ++j) for (k=head[j]; k!=-1; k=edge[k].next) if ( dist[edge[k].to] > dist[j] + edge[k].w ) dist[edge[k].to] = dist[j] + edge[k].w; for (j=0; j<=n; ++j) //若仍能进行松弛,说明存在负权回路 for (k=head[j]; k!=-1; k=edge[k].next) if ( dist[edge[k].to] > dist[j] + edge[k].w ) return true; return false; } int main() { int f,i,s,e,t,tot; scanf("%d",&f); while (f--){ memset(head,-1,sizeof(head)); scanf("%d %d %d", &n, &m, &w); for (tot=0; tot<n; ++tot){ //加入超级源点0和图中每一点相连且边权值为0 edge[tot].to = tot+1; edge[tot].w = 0; edge[tot].next = head[0]; head[0] = tot; } for (i=0; i<m; ++i){ //读入普通边 scanf("%d %d %d", &s, &e, &t); edge[tot].to = e; //无向边存两遍 edge[tot].w = t; edge[tot].next = head[s]; head[s] = tot++; edge[tot].to = s; edge[tot].w = t; edge[tot].next = head[e]; head[e] = tot++; } for (i=0; i<w; ++i){ //读入虫洞 scanf("%d %d %d", &s, &e, &t); edge[tot].to = e; edge[tot].w = -t; edge[tot].next = head[s]; head[s] = tot++; } if ( BellmanFord() ) printf("YES\n"); //对超级源点0调用BF算法 else printf("NO\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator