hdu1142
来源:互联网 发布:迅雷mac 编辑:程序博客网 时间:2024/06/05 19:01
#include <iostream>using namespace std;int map[1001][1002];int dist[1002],dp[1002];int n;void dijkstra(int v){ int mins,index; int *s = new int[n+1]; for(int i=1;i<=n;i++) { s[i]=0; dist[i]=map[i][v]; } s[v]=1; dist[v]=0; for(int i=1;i<n;i++) { mins=2000000; for(int j=1;j<=n;j++) { if(s[j]==0&&mins>dist[j]) { mins=dist[j]; index=j; } } if(mins==2000000) break; s[index]=1; for(int j=1;j<=n;j++) { if(s[j]==0&&dist[j]>dist[index]+map[j][index]) dist[j]=dist[index]+map[j][index]; } }}int dfs(int v){ if(dp[v]!=-1) // 表示此点已被搜过, 切还回了对应的路径数,当有点在经过时, //直接还回此点能到达终点的条数即可; //此处要注意, 不然会少计算路径数; return dp[v]; if(v==2) return 1; int temp,sum=0; for(int i=1;i<=n;i++) { if(map[v][i]!=2000000&&dist[v]>dist[i]) { temp=dfs(i); sum+=temp; } } dp[v]=sum; return sum;}int main(){ int m,i,j,d; while(cin>>n&&n) { cin>>m; for(i=1;i<=n;i++) { dp[i]=-1; for(j=1;j<=n;j++) { map[i][j]=2000000; } } while(m--) { scanf("%d%d%d",&i,&j,&d); map[i][j]=map[j][i]=d; } dijkstra(2); dfs(1); cout<<dp[1]<<endl; } return 0;}