hdu 1688 Sightseeing
http://acm.hdu.edu.cn/showproblem.php?pid=1688
这道题就是求最短路路径和次短路路径的条数。
用一个二维数组记录每一个节点距离起始点的最短距离和次短距离,再开一个二维数组记录路径数
更新状态时:
1)新值小于最短路径长:更新最短路径长,计数;次短路径长,计数
2)新值等于最短路径长:更新最短路径计数
3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数
4)新值等于次短路径长:更新次短路径计数
1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <queue> 5 #include <algorithm> 6 #define maxn 2000 7 using namespace std; 8 const int inf=1<<30; 9 struct edge 10 { 11 int v,w; 12 }; 13 14 struct node 15 { 16 int d,v; 17 int mark; 18 bool operator < (const node &a)const 19 { 20 if(d!=a.d) 21 return d>a.d; 22 return v>a.v; 23 } 24 }; 25 26 vector<edge>edges[maxn]; 27 int dis[maxn][3]; 28 int vis[maxn][3]; 29 int path[maxn][3]; 30 int n,m,a,b,c,s1,f; 31 node st; 32 33 34 void inti() 35 { 36 for(int i=0; i<=n; i++) 37 { 38 dis[i][1]=dis[i][2]=inf; 39 } 40 memset(path,0,sizeof(path)); 41 memset(vis,false,sizeof(vis)); 42 } 43 44 void dijkstra(int s,int e) 45 { 46 inti(); 47 priority_queue<node>q; 48 dis[s][1]=0; 49 path[s][1]=1; 50 memset(vis,false,sizeof(vis)); 51 st.d=0; st.v=s; 52 st.mark=1; 53 q.push(st); 54 while(!q.empty()) 55 { 56 node st1=q.top(); q.pop(); 57 if(vis[st1.v][st1.mark]) continue; 58 vis[st1.v][st1.mark]=true; 59 for(int i=0; i<(int)edges[st1.v].size(); i++) 60 { 61 int v1=edges[st1.v][i].v; 62 int w1=edges[st1.v][i].w; 63 if(!vis[v1][1]&&st1.d+w1<dis[v1][1]) 64 { 65 if(dis[v1][1]!=inf) 66 { 67 dis[v1][2]=dis[v1][1]; 68 path[v1][2]=path[v1][1]; 69 st.d=dis[v1][2]; st.v=v1; st.mark=2; 70 q.push(st); 71 } 72 dis[v1][1]=st1.d+w1; 73 path[v1][1]=path[st1.v][st1.mark]; 74 st.v=v1; st.mark=1; st.d=dis[v1][1]; 75 q.push(st); 76 } 77 else if(!vis[v1][1]&&st1.d+w1==dis[v1][1]) 78 { 79 path[v1][1]+=path[st1.v][st1.mark]; 80 } 81 else if(!vis[v1][2]&&st1.d+w1<dis[v1][2]) 82 { 83 dis[v1][2]=st1.d+w1; 84 path[v1][2]=path[st1.v][st1.mark]; 85 st.d=dis[v1][2]; st.v=v1; st.mark=2; 86 q.push(st); 87 } 88 else if(!vis[v1][2]&&st1.d+w1==dis[v1][2]) 89 { 90 path[v1][2]+=path[st1.v][st1.mark]; 91 } 92 } 93 } 94 } 95 96 int main() 97 { 98 int t; 99 scanf("%d",&t); 100 while(t--) 101 { 102 scanf("%d%d",&n,&m); 103 inti(); 104 for(int i=0; i<=n; i++) edges[i].clear(); 105 for(int i=0; i<m; i++) 106 { 107 scanf("%d%d%d",&a,&b,&c); 108 edge m1; m1.v=b; m1.w=c; 109 edges[a].push_back(m1); 110 } 111 scanf("%d%d",&s1,&f); 112 dijkstra(s1,f); 113 if(dis[f][1]+1==dis[f][2]) 114 { 115 printf("%d\n",path[f][1]+path[f][2]); 116 } 117 else 118 printf("%d\n",path[f][1]); 119 } 120 return 0; 121 }