#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;
}
hdu1142
最新推荐文章于 2020-02-19 22:52:32 发布