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 }

 

posted @ 2014-03-08 14:06  little_w  阅读(430)  评论(0编辑  收藏  举报