poj 1511 Invitation Cards(spfa)
2012-12-16 17:57
399 查看
给一个有向图。求 1到所有点的最小距离之和与所有点到1最小距离之和相加的最小值。
用一个正向的原图做一次SPFA..再将所有边反过来做一次SPFA。
这题WA出翔了。最后发现dis数组和ans要用long long 来存。并且INF的选取也要小心,不能太大也不能太小。还有就是define INF的时候,后面要有ll,表示这是长整型。不然codeblocks里编译会有warning。但是提交不影响结果。
用一个正向的原图做一次SPFA..再将所有边反过来做一次SPFA。
这题WA出翔了。最后发现dis数组和ans要用long long 来存。并且INF的选取也要小心,不能太大也不能太小。还有就是define INF的时候,后面要有ll,表示这是长整型。不然codeblocks里编译会有warning。但是提交不影响结果。
// spfa是BellmanFord的改进。但spfa没有判断负权回路的功能(当然可以通过记录每个点入队的次数来判断,若一个点入队超过n(结点数)次,说明有负权回路),需要事先判断好,否则spfa不能正常工作。 //因为spfa要用到,与某个点相邻的所有边,因此建图的时候要注意保存这一信息。 //池子法里的first数组可以记录这一信息 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #define MAXNODE 1000500 #define MAXEDGE 1600000 #define INF 250000000000ll //这里要注意,不然会有warning(codeblocks) using namespace std; struct Edge { int from,to,cost,next; } edge[MAXEDGE]; int first[MAXNODE]; queue <int> Q; long long dis[MAXNODE]; bool inqueue[MAXNODE]; long long spfa(int n,int m)//n为点数,m为边数 { long long ans=0; dis[1]=0; //1是源点 memset(inqueue,0,sizeof(inqueue)); for(int i=2; i<=n; i++) { dis[i]=INF; } inqueue[1]=true; while(!Q.empty())Q.pop(); Q.push(1); int t; while(!Q.empty()) { t=Q.front(); Q.pop(); inqueue[t]=false; if(first[t]==-1)continue; Edge et=edge[first[t]]; while(1) { if(dis[et.to]>dis[et.from]+et.cost) { dis[et.to]=dis[et.from]+et.cost; if(!inqueue[et.to]) { Q.push(et.to); inqueue[et.to]=1; } } if(et.next==-1)break; else et=edge[et.next]; } } for(int i=2;i<=n;i++) { ans+=dis[i]; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; long long res=0; scanf("%d %d",&n,&m); memset(first,-1,sizeof(first)); for(int i=0; i<m; i++) { scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].cost); //这里存的是有向图 edge[i].next=first[edge[i].from]; //头插 first[edge[i].from]=i;//存储边的下标 } res+=spfa(n,m); memset(first,-1,sizeof(first)); for(int i=0;i<m;i++) //将原有向图反过来 { int temp; temp=edge[i].from; edge[i].from=edge[i].to; edge[i].to=temp; edge[i].next=first[edge[i].from]; //头插 first[edge[i].from]=i;//存储边的下标 } res+=spfa(n,m); printf("%I64d\n",res); } return 0; }
相关文章推荐
- poj 1511 SPFA
- POJ 1511 SPFA 模板
- POJ1511 Invitation Cards(spfa模板题)
- 最短路练习10/poj/1511 Invitation Cards ,(两次spfa),(单源最短路,优先队列优化的Dijkstra)
- POJ 1511 spfa求最短回路
- poj 1511 spfa水题
- Poj 1511 Invitation Cards(spfa)
- POJ1511 SPFA水题
- [POJ 1511]Invitation Cards[链式前向星][SPFA]
- (POJ 1511)Invitation Cards 有向图来回最短路 + SPFA (复习必看题)
- poj 1511 spfa
- Invitation Cards POJ - 1511 最短路spfa
- POJ 1511 Invitation Cards (SPFA+反向建图)
- poj 1511 spfa入门
- poj 1511 Invitation Cards SPFA
- POJ1511 SPFA模版 用边存的最短路
- (简单) POJ 1511 Invitation Cards,SPFA。
- POJ 1511 Invitation Cards (spfa||堆优化)
- poj 1511 Invitation Cards (SPFA、邻接表)
- poj 1511 SPFA