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 |
SPFA果然很嚣张。。In Reply To:关于Bellman-Ford算法的bug Posted by:Ruby931031 at 2012-03-21 17:49:36 SPFA()果然更快。。 //125ms #include <stdio.h> //链式前向星 + SPFA #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],q[MAXM<<10],outq[MAXN],n,m,w; bool inq[MAXN]; bool SPFA(){ int i,iq,k,top; for (i=1; i<=n; ++i) { //直接将其他所有节点入队 dist[i]=outq[i]=0; q[i]=i; inq[i]=true; } i=1,iq=n+1; while (i!=iq){ inq[ top=q[i] ] = false; if ( ++outq[top] > n ) return true; for ( k=head[top]; k!=-1; k=edge[k].next ) if ( dist[edge[k].to] > dist[top] + edge[k].w ) { dist[edge[k].to] = dist[top] + edge[k].w; if ( !inq[edge[k].to] ) { inq[ edge[k].to ] = true; q[iq++] = edge[k].to; } } ++i; } 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=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 ( SPFA() ) printf("YES\n"); //对超级源点0调用SPFA算法 else printf("NO\n"); } return 0; } //下面这个循环队列157ms.. bool SPFA(){ int i,iq,k,top,end=(n<<1)+1; //使用循环队列q[1..2n] for (i=1; i<=n; ++i) { //直接将其他所有节点入队 dist[i]=outq[i]=0; q[i]=i; inq[i]=true; } i=1,iq=n+1; while (i!=iq){ //队列的范围是[i..iq) inq[ top=q[i] ] = false; if ( ++outq[top] > n ) return true; for ( k=head[top]; k!=-1; k=edge[k].next ) if ( dist[edge[k].to] > dist[top] + edge[k].w ) { dist[edge[k].to] = dist[top] + edge[k].w; if ( !inq[edge[k].to] ) { inq[ edge[k].to ] = true; q[iq++] = edge[k].to; if (iq==end) iq=1; } } if (++i == end) i=1; } return false; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator