您的位置:首页 > 其它

HDU-1142 A Walk Through the Forest

2014-05-12 18:27 302 查看
题目链接

假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,

则可以从 A 通往 B 处,问满足这种的条件的路径条数。

#include "stdio.h"
#include "string.h"
const int maxn = 1005;
const int inf = 1<<29;
int map[maxn][maxn],dis[maxn],dp[maxn];
int n,m,count;
void Dijkstra(int x)
{
int i,j;
bool vis[maxn] = {false};
dis[x] = 0;
for( i=1;i<n;i++ )
{
int temp = inf;
int p = x;
for( j=1;j<=n;j++ )
{
if( !vis[j] && dis[j] < temp )
{
temp = dis[p=j];
}
}
vis[p] = true;
for( j=1;j<=n;j++ )
{
if( !vis[j] &&  dis[j] > dis[p] + map[p][j] )
{
dis[j] = dis[p] + map[p][j];
}
}
}
}

int DFS( int x )
{
if( dp[x]!=-1 )
return dp[x];

if( x==2 )
return 1;

dp[x] = 0;
for( int i=1;i<=n;i++ )
{
if( map[x][i]<inf && dis[x] > dis[i] )
{
dp[x] += DFS( i );
}
}
return dp[x];
}

int main()
{
int i,j,a,b,c;
while( scanf("%d",&n)!=EOF && n)
{
memset( dp,-1,sizeof(dp) );
for( i=0;i<=n;i++ )
{
for( j=i;j<=n;j++ )
map[i][j] = map[j][i] = inf;
dis[i] = inf;
}
scanf("%d",&m);
for( i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b] = map[b][a] = map[a][b]>c?c:map[a][b];
}
Dijkstra(2);

printf("%d\n",DFS(1) );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: