题意:一个简单图,求这个图两点之间的次短路!
分析:因为只要求次短路,所以只要保存两点之间的最短和次短这两个状态即可,用dijkstra可求出....
同时要注意,若a->a,这则点的最短路为0!还有要注意的是最短路和次短路的距离不能相等!
// File Name: 10342.cpp // Author: Zlbing // Created Time: 2013/5/18 11:02:05 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define LL long long #define REP(i,r,n) for(int i=r;i<=n;i++) #define RREP(i,n,r) for(int i=n;i>=r;i--) const int MAXN=105; int d[MAXN][MAXN][2]; int G[MAXN][MAXN]; int n,m; struct node{ int u,cost; bool operator <(const node& a)const{ return cost>a.cost; } }; void dij(int s) { priority_queue<node>Q; for(int i=0;i<n;i++) if(G[s][i]) Q.push((node){i,G[s][i]}); node t,tt; while(!Q.empty()) { t=Q.top(); Q.pop(); int u=t.u; int cost=t.cost; if(d[s][u][0]==0) { d[s][u][0]=cost; } else{ if(d[s][u][0]>cost) { d[s][u][1]=d[s][u][0]; d[s][u][0]=cost; } else if(d[s][u][0]==cost)continue; else if(d[s][u][1]==0||d[s][u][1]>cost) { d[s][u][1]=cost; } else continue; } for(int i=0;i<n;i++) { if(G[u][i]) Q.push((node){i,G[u][i]+cost}); } } } int main() { int T=0; //freopen("out.txt","w",stdout); while(~scanf("%d%d",&n,&m)) { int a,b,c; CL(G,0); REP(i,1,m) { scanf("%d%d%d",&a,&b,&c); G[a][b]=c; G[b][a]=c; } printf("Set #%d\n",++T); CL(d,0); REP(i,0,n-1) dij(i); int cas; scanf("%d",&cas); REP(i,1,cas) { scanf("%d%d",&a,&b); if(a!=b){ if(d[a][b][1]) printf("%d\n",d[a][b][1]); else printf("?\n"); } else { if(d[a][b][0]) printf("%d\n",d[a][b][0]); else printf("?\n"); } } } return 0; }