hdu 1142 A Walk Through the Forest

http://acm.hdu.edu.cn/showproblem.php?pid=1142

这道题是spfa求最短路,然后dfs()求路径数。

  1 #include <cstdio>
  2 #include <queue>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define maxn 1001
  6 using namespace std;
  7 const int inf=1<<30;
  8 
  9 int g[maxn][maxn];
 10 int dis[maxn];
 11 bool vis[maxn],visi[maxn];
 12 int n,m,a,b,d;
 13 int di;
 14 int cnt[maxn];
 15 int num[maxn];
 16 
 17 bool spfa()
 18 {
 19     queue<int>q;
 20     memset(vis,false,sizeof(vis));
 21     memset(cnt,0,sizeof(cnt));
 22     for(int i=1; i<=n; i++) dis[i]=inf;
 23     dis[2]=0;
 24     vis[2]=true;
 25     q.push(2);
 26     while(!q.empty())
 27     {
 28         int u=q.front();
 29         q.pop();
 30         vis[u]=false;
 31         for(int i=1; i<=n; i++)
 32         {
 33             if(dis[i]>dis[u]+g[u][i]&&g[u][i]!=inf)
 34             {
 35                 dis[i]=dis[u]+g[u][i];
 36                 if((++cnt[i])>n) return false;
 37                 if(!vis[i])
 38                 {
 39                     q.push(i);
 40                     vis[i]=true;
 41                 }
 42             }
 43         }
 44     }
 45     return true;
 46 }
 47 
 48 void dfs(int src)
 49 {
 50     if(src==2)
 51     {
 52         num[2]=1;
 53         return ;
 54     }
 55     int sum=0;
 56     for(int i=1; i<=n; i++)
 57     {
 58         if(g[src][i]!=inf&&dis[src]>dis[i])
 59         {
 60             if(num[i]>=0)
 61             {
 62                 sum+=num[i];
 63             }
 64             else
 65             {
 66                 dfs(i);
 67                 sum+=num[i];
 68             }
 69         }
 70     }
 71     num[src]=sum;
 72 }
 73 int main()
 74 {
 75     while(scanf("%d",&n)!=EOF)
 76     {
 77         if(n==0) break;
 78         scanf("%d",&m);
 79         for(int i=1; i<=n; i++)
 80         {
 81             for(int j=1; j<=n; j++)
 82             {
 83                 if(i==j) g[i][j]=0;
 84                 else g[i][j]=inf;
 85             }
 86         }
 87         for(int i=0; i<m; i++)
 88         {
 89             scanf("%d%d%d",&a,&b,&d);
 90             g[a][b]=g[b][a]=min(g[a][b],d);
 91         }
 92         spfa();
 93         //printf("%d\n",dis[1]);
 94         for(int i=1; i<=n; i++)
 95         {
 96             num[i]=-1;
 97         }
 98         dfs(1);
 99         printf("%d\n",num[1]);
100     }
101     return 0;
102 }
View Code

 

posted @ 2014-04-24 20:32  null1019  阅读(125)  评论(0编辑  收藏  举报