您的位置:首页 > 其它

hdu-1142-A Walk Through the Forest

2015-08-17 14:21 561 查看
就是从1到2之间,下一点到2的距离比当前点到2的距离要短,问这样的路径有多少条。

最短路径+记忆化搜索解决

#include<iostream>
#include<cstring>
using namespace std;
const int MAX=1001;
const int INF=99999999;
int m,n;
int map[MAX][MAX];
int dis[MAX];
int use[MAX];
void Init()
{
memset(use,0,sizeof(use));
for(int i=1; i<MAX; i++)
for(int j=1; j<MAX; j++)
map[i][j]=map[j][i]=INF;
}
void dijkstra(int s)
{
bool vis[MAX];
memset(vis,false,sizeof(vis));
int pos=s;
vis[pos]=true;
dis[pos]=0;
for(int i=1; i<=n; i++)
if(i!=pos)
dis[i]=map[pos][i];
for(int i=1; i<n; i++)
{
int min=INF;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
pos=j;
}
}
vis[pos]=true;
for(int k=1; k<=n; k++)
{
if(!vis[k]&&dis[k]>dis[pos]+map[pos][k])
dis[k]=dis[pos]+map[pos][k];
}
}
}
int dfs(int x)
{
int sum=0;
if(x==2)
return 1;
if(use[x])
return use[x];
for(int i=1; i<=n; i++)
{
if(map[x][i]!=INF&&dis[x]>dis[i]&&x!=i)
{
sum+=dfs(i);
}
}
use[x]=sum;
return use[x];
}
int main()
{
int a,b,time;
while(cin>>n&&n!=0)
{
cin>>m;
Init();
for(int i=1; i<=m; i++)
{
cin>>a>>b>>time;
if(map[a][b]>time||map[b][a]>time)
map[a][b]=map[b][a]=time;
}
dijkstra(2);
cout<<dfs(1)<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: