uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数
1 //uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数 2 #include<iostream> 3 #include<string.h> 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<cmath> 7 #include<algorithm> 8 #include<queue> 9 #include<stack> 10 #include<set> 11 #include<map> 12 #define maxn 1100 13 #define INF 100000000 14 using namespace std; 15 16 vector<int>G[maxn]; 17 int d[maxn];//DAG上dfs记忆化,存储i到终点的路径数 18 struct Edge 19 { 20 int u,v,dis; 21 }; 22 struct Node 23 { 24 int d,u; 25 bool operator<(const Node &x)const{ 26 return d>x.d; 27 } 28 }; 29 struct Dijkstra 30 { 31 int n,m; 32 vector<Edge>edge; 33 vector<int>G[maxn]; 34 bool vis[maxn]; 35 int d[maxn],p[maxn]; 36 37 void init(int n) 38 { 39 this->n=n; 40 edge.clear(); 41 for(int i=0;i<=n;i++) G[i].clear(); 42 } 43 44 void add(int u,int v,int c){ 45 edge.push_back((Edge){u,v,c}); 46 m=edge.size(); 47 G[u].push_back(m-1); 48 } 49 50 void dij(int s) 51 { 52 memset(vis,0,sizeof(vis)); 53 for(int i=0;i<=n;i++) d[i]=INF; 54 d[s]=0; 55 priority_queue<Node>Q; 56 Q.push((Node){0,s}); 57 while(!Q.empty()){ 58 Node x=Q.top();Q.pop(); 59 int u=x.u; 60 if (vis[u]) continue; 61 vis[u]=true; 62 for(int i=0;i<G[u].size();i++) 63 { 64 Edge &e=edge[G[u][i]]; 65 if (d[e.v]>d[u]+e.dis){ 66 d[e.v]=d[u]+e.dis; 67 p[e.v]=G[u][i]; 68 Q.push((Node){d[e.v],e.v}); 69 } 70 } 71 } 72 } 73 }Dij1; 74 75 int nextint(){int x;scanf("%d",&x);return x;} 76 77 int n,m,ans; 78 79 int dfs(int st)//DAG上dp,记忆化搜索 80 { 81 int ans=0; 82 if (d[st]!=-1) return d[st]; 83 for(int i=0;i<G[st].size();i++) ans+=dfs(G[st][i]); 84 return d[st]=ans; 85 } 86 void read(int n,int m) 87 { 88 for(int i=0;i<m;i++) 89 { 90 int u,v,c; 91 u=nextint();v=nextint();c=nextint(); 92 Dij1.add(u,v,c); 93 Dij1.add(v,u,c); 94 } 95 Dij1.dij(2); 96 } 97 void solve(int n,int m) 98 { 99 for(int i=1;i<=n;i++) G[i].clear(); 100 //建图,注意是枚举每条边,不可能构造出新的边~ 101 for(int i=0;i<Dij1.m;i++) 102 { 103 Edge e=Dij1.edge[i]; 104 int u=e.u,v=e.v; 105 if (Dij1.d[u]<Dij1.d[v]) G[v].push_back(u); 106 } 107 for(int i=1;i<=n;i++) d[i]=-1; 108 d[2]=1; 109 dfs(1); 110 printf("%d\n",d[1]); 111 } 112 int main() 113 { 114 int n,m; 115 while(cin>>n) 116 { 117 if (n==0) break; 118 cin>>m; 119 Dij1.init(n); 120 read(n,m); 121 solve(n,m); 122 } 123 return 0; 124 }