标签:des style blog color io os java ar strong
5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0
2 4
题意:求一共有几条最短路,先用dijkstra算法求出每个点到目标点的最短距离,然后,从源点开始深搜求dis[v]<dis[u]的数目。用到记忆化搜索。
#include"stdio.h"
#include"string.h"
#include"math.h"
#include"iostream"
#include"algorithm"
using namespace std;
#define N 1005
const int inf=0x7fffffff;
int mark[N],dis[N];
int g[N][N],n;
void dijkstra(int s)
{
int i,u,min;
memset(mark,0,sizeof(mark));
for(i=0;i<=n;i++)
dis[i]=g[s][i];
dis[s]=0;
mark[s]=1;
while(1)
{
min=inf;
u=s;
for(i=1;i<=n;i++)
{
if(min>dis[i]&&!mark[i])
{
min=dis[i];
u=i;
}
}
if(u==s)
break;
mark[u]=1;
for(i=1;i<=n;i++)
{
if(g[u][i]!=inf&&dis[i]>dis[u]+g[u][i])
dis[i]=dis[u]+g[u][i];
}
}
}
int bfs(int u)
{
if(mark[u])
return mark[u];
int i,cnt=0;
for(i=1;i<=n;i++)
{
if(u==i||g[u][i]==inf)
continue;
if(dis[u]>dis[i])
{
cnt+=bfs(i);
}
}
return mark[u]=cnt;
}
int main()
{
int i,j,u,v,d,m;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
g[i][j]=(i==j?0:inf);
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&d);
g[u][v]=g[v][u]=d;
}
dijkstra(2);
memset(mark,0,sizeof(mark));
mark[2]=1;
int ans=bfs(1);
printf("%d\n",ans);
}
return 0;
}hdu 1142 A Walk Through the Forest (最短路+dfs )
标签:des style blog color io os java ar strong
原文地址:http://blog.csdn.net/u011721440/article/details/39299679