hdu1142 深搜+dp+最短路径。

结合的好啊。。

  1 #include <cstdlib>
  2 #include <iostream>
  3 #include <queue>
  4 #include<vector>
  5 
  6 using namespace std;
  7 struct edge
  8 {
  9     int from,to,cost;
 10 };
 11 const int MAXN=1003;
 12 const int MAX=2147483647;
 13 bool in_queue[MAXN];//
 14 bool visited[MAXN];//
 15 int dist[MAXN];//
 16 //int sum=0;//
 17 int dp[MAXN];
 18 vector<edge>v[MAXN];//
 19 void spfa(int p)
 20 {
 21     int i=0;
 22     queue<int>q;
 23     while(!q.empty())
 24     {
 25         q.pop();
 26     }
 27     for(i=0;i<=MAXN-1;i++)
 28     {
 29         dist[i]=MAX;
 30     }
 31     dist[p]=0;
 32     q.push(p);
 33     in_queue[p]=1;
 34     while(!q.empty())
 35     {
 36         int i=0;
 37         int cur=q.front();
 38         q.pop();
 39         in_queue[cur]=0;
 40         for(i=0;i<=int(v[cur].size())-1;i++)
 41         {
 42             int cost=v[cur][i].cost+dist[cur];
 43             int to=v[cur][i].to;
 44             if(cost<dist[to])
 45             {
 46                 dist[to]=cost;
 47                 if(!in_queue[to])
 48                 {
 49                     q.push(to);
 50                     in_queue[to]=1;
 51                 }
 52             }
 53         }
 54     }
 55 }
 56 int dfs(int p)
 57 {
 58     int i=0;
 59     int sum=0;
 60     if(dp[p]!=-1)
 61     {
 62         return dp[p];
 63     }
 64     if(p==2)
 65     {
 66         return dp[p]=1;
 67     }
 68     for(i=0;i<=int(v[p].size())-1;i++)
 69     {
 70         int to=v[p][i].to;
 71         if((!visited[to])&&(dist[to]<dist[p]))
 72         {
 73             visited[to]=1;
 74             sum=sum+dfs(to);
 75             visited[to]=0;
 76         }
 77     }
 78     return dp[p]=sum;
 79 }
 80 int main(int argc, char *argv[])
 81 {
 82     int n,m;
 83     while((cin>>n)&&(n!=0)&&(cin>>m))
 84     {
 85         int dist2home[MAXN];
 86         int i=0;
 87         for(i=0;i<=MAXN-1;i++)
 88         {
 89             v[i].clear();
 90         }
 91 //        sum=0;
 92         memset(visited,0,sizeof(visited));
 93         memset(in_queue,0,sizeof(in_queue));
 94         memset(dp,-1,sizeof(dp));
 95         while(m--)
 96         {
 97             int from,to,cost;
 98             cin>>from>>to>>cost;
 99             edge e={from,to,cost};
100             v[e.from].push_back(e);
101             swap(e.from,e.to);
102             v[e.from].push_back(e);
103         }
104         spfa(2);
105         
106         cout<<dfs(1)<<endl;
107     }
108     //system("PAUSE");
109     return EXIT_SUCCESS;
110 }
posted @ 2012-07-26 10:01  77695  阅读(215)  评论(0编辑  收藏  举报