hdu 1142 A Walk Through the Forest

来源:互联网 发布:软件实施工程师要求 编辑:程序博客网 时间:2024/05/17 19:14
#include<iostream>#include<cstring>#include<climits>#include<cstdio>using namespace std;#define MAX 1005int map[MAX][MAX],num[MAX],d[MAX];bool use[MAX];int n,m;void init(){memset(map,-1,sizeof(map));memset(num,-1,sizeof(num));memset(d,-1,sizeof(d));memset(use,false,sizeof(use));while(m--){int a,b,c;scanf("%d %d %d",&a,&b,&c);if(map[a][b]<0 || map[a][b]>c )map[a][b]=map[b][a]=c;}}void dijkstra(){int i,j,k=2;use[2]=true;for(i=1;i<=n;i++) d[i]=map[i][2];d[2]=0;for(i=1;i<n;i++){int min=INT_MAX;for(j=1;j<=n;j++){if(!use[j] && d[j]>0 && min>d[j])min=d[k=j];}if(min==INT_MAX)break;use[k]=true;for(j=1;j<=n;j++){if(!use[j] && map[k][j]>0 && (d[j]<0 || d[j]>map[k][j]+d[k]) )d[j]=d[k]+map[k][j];}}}int dfs(int v){if(num[v]!=-1)return num[v];int sum=0;for(int i=1;i<=n;i++){if(  map[v][i]>0  && d[v] > d[i]) //v比i到终点的距离要长,且v到i是存在通路的。sum+=dfs(i);}return num[v]=sum;}int main(){while(~scanf("%d",&n) && n){scanf("%d",&m);init();dijkstra();num[2]=1;cout<<dfs(1)<<endl;}return 0;}

原创粉丝点击