http://poj.org/problem?id=1511
最短路问题
dijkstra邻接表+优先队列算法
正面算一次,反图算一次
题目明明说的不超long long
全部改成long long 才过
代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <stack> #include <iostream> #include <vector> #include <queue> using namespace std; const long long maxn =1000000001; long long first[1000005]; long long next[1000005]; long long Nfirst[1000005]; long long Nnext[1000005]; long long v[1000005]; long long u[1000005]; long long w[1000005]; long long p,q; long long d[1000005]; long long down[1000005]; long long sum; typedef pair<long long,long long> pii; priority_queue<pii,vector<pii>,greater<pii> > que; long long init() { for(long long i=1;i<=p;i++) first[i]=Nfirst[i]=-1; for(long long i=1;i<=q;i++) next[i]=Nnext[i]=-1; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); while(!que.empty()) que.pop(); } long long dijkstra() { while(!que.empty()) que.pop(); que.push(make_pair(d[1],1)); while(!que.empty()) { pii k=que.top(); que.pop(); long long x=k.second; if(down[k.second]==1) continue; down[k.second]=1; for(long long e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; que.push(make_pair(d[v[e]],v[e])); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); return 1; } long long Ndijkstra() { while(!que.empty()) que.pop(); que.push(make_pair(d[1],1)); while(!que.empty()) { pii k=que.top(); que.pop(); long long x=k.second; if(down[k.second]==1) continue; down[k.second]=1; for(long long e=Nfirst[x];e!=-1;e=Nnext[e]) { if(d[u[e]]>d[x]+w[e]) { d[u[e]]=d[x]+w[e]; que.push(make_pair(d[u[e]],u[e])); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; } int main() { long long T; scanf("%I64d",&T); while(T--) { sum=0; scanf("%I64d%I64d",&p,&q); init(); for(long long i=1;i<=q;i++) { scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; Nnext[i]=Nfirst[v[i]]; Nfirst[v[i]]=i; } dijkstra(); Ndijkstra(); printf("%I64d\n",sum); } return 0; }
SPFA算法
好像就一个用队列,一个用优先队列的区别
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <stack> #include <iostream> #include <vector> #include <queue> using namespace std; const long long maxn =1000000001; long long first[1000005]; long long next[1000005]; long long Nfirst[1000005]; long long Nnext[1000005]; long long v[1000005]; long long u[1000005]; long long w[1000005]; long long p,q; long long d[1000005]; long long down[1000005]; long long sum; queue<long long> que; long long init() { for(long long i=1;i<=p;i++) first[i]=Nfirst[i]=-1; for(long long i=1;i<=q;i++) next[i]=Nnext[i]=-1; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); } long long dijkstra() { while(!que.empty()) que.pop(); que.push(1); down[1]=1; while(!que.empty()) { long long x=que.front(); que.pop(); down[x]=0; for(long long e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; if(down[v[e]]==0) que.push(v[e]); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); } long long Ndijkstra() { while(!que.empty()) que.pop(); que.push(1); down[1]=1; while(!que.empty()) { long long x=que.front(); que.pop(); down[x]=0; for(long long e=Nfirst[x];e!=-1;e=Nnext[e]) { if(d[u[e]]>d[x]+w[e]) { d[u[e]]=d[x]+w[e]; if(down[u[e]]==0) que.push(u[e]); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; } int main() { long long T; scanf("%I64d",&T); while(T--) { sum=0; scanf("%I64d%I64d",&p,&q); init(); for(long long i=1;i<=q;i++) { scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; Nnext[i]=Nfirst[v[i]]; Nfirst[v[i]]=i; } dijkstra(); Ndijkstra(); printf("%I64d\n",sum); } return 0; }