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;}