# include <iostream>
# include <string.h>
using namespace std;
# define N 1010
# define INF 1000005
int visit[N],map[N][N],d[N],p[N];
void dij(int s,int n)
{
int i,j,k;
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
d[i]=map[i][s];
visit[s]=1;
d[s]=0;
for(i=1;i<n;i++)
{
int min = INF;
for(j=1;j<=n;j++)
{
if(!visit[j]&&d[j]<min)
{
min=d[j];
k=j;
}
}
if(min==INF)
break;
visit[k]=1;
d[k]=min;
for(j=1;j<=n;j++)
{
if(!visit[j]&&map[j][k]+d[k]<d[j])
d[j]=map[j][k]+d[k];
}
}
}
int dfs(int s,int n)
{
int i,sum=0;
if(s==2) return 1;
if(p[s]) return p[s];
for(i=1;i<=n;i++)
{
if(map[s][i]<INF&&d[s]>d[i])
sum+=dfs(i,n);
}
p[s]=sum;
return p[s];
}
int main ()
{
int i,j,u,v,w,num,road;
while(scanf("%d",&num)&&num)
{
scanf("%d",&road);
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
{
map[i][j]=INF;
}
}
for(i=1;i<=road;i++)
{
scanf("%d %d %d",&v,&u,&w);
map[v][u]=map[u][v]=w;
}
dij(2,num);
memset(p,0,sizeof(p));
printf("%d\n",dfs(1,num));
}
return 0;
}
Dijkstra 和dfs
hdu 1142
最新推荐文章于 2021-05-18 16:52:09 发布