题意看错 晕呐
1 /***hdu1142 2 dijskra+dfs 3 ***/ 4 #include<stdio.h> 5 #include<string.h> 6 #define maxint 99999999 7 int map[1003][1003],n,m,flag; 8 int mark[1003],dis[1003]; 9 int dijskra(int s) 10 { 11 int i,j,pos; 12 int vis[1000]; 13 memset(vis,0,sizeof(vis)); 14 for(i=1;i<=n;i++) 15 { 16 dis[i]=map[s][i]; 17 } 18 dis[s]=0; 19 vis[s]=1; 20 pos=s; 21 for(i=1;i<n;i++) 22 { 23 pos=s; 24 int minn=maxint; 25 for(j=1;j<=n;j++) 26 { 27 if(!vis[j]&&minn>dis[j]) 28 { 29 minn=dis[j]; 30 pos=j; 31 } 32 } 33 vis[pos]=1; 34 for(j=1;j<=n;j++) 35 { 36 if(!vis[j]&&(dis[j]>map[pos][j]+dis[pos])) 37 { 38 dis[j]=map[pos][j]+dis[pos]; 39 } 40 } 41 } 42 return dis[1]; 43 } 44 int dfs(int x) 45 { 46 if(x==2) 47 { 48 return 1; 49 } 50 if(mark[x]) return mark[x]; 51 for(int i=1;i<=n;i++) 52 { 53 54 if(i!=x&&dis[i]<dis[x]&&map[x][i]!=maxint) 55 { 56 mark[x]+=dfs(i);//mark[]存储当前几个点 57 } 58 } 59 return mark[x]; 60 } 61 int main() 62 { 63 int i,j; 64 while(scanf("%d%d",&n,&m)!=EOF) 65 { 66 if(!n) 67 break; 68 for(j=0;j<=n;j++) 69 for(i=0;i<=n;i++) 70 { 71 if(i==j)map[i][j]=0; 72 else 73 { 74 map[j][i]=maxint; 75 map[i][j]=maxint; 76 } 77 } 78 for(i=0;i<m;i++) 79 { 80 int x,y,z; 81 scanf("%d%d%d",&x,&y,&z); 82 map[x][y]=z;map[y][x]=z; 83 } 84 memset(mark,0,sizeof(mark)); 85 dijskra(2);//因为题意:若B到终点的距离小于A到终点的距离,那么就走B,所以要倒着找出他们的路径 86 int ans=dfs(1); 87 printf("%d\n",ans); 88 } 89 }
时间: 2024-10-07 00:51:38