您的位置:首页 > 其它

hdu 1142 A Walk Through the Forest

2014-04-24 20:32 316 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1142

这道题是spfa求最短路,然后dfs()求路径数。

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define maxn 1001
using namespace std;
const int inf=1<<30;

int g[maxn][maxn];
int dis[maxn];
bool vis[maxn],visi[maxn];
int n,m,a,b,d;
int di;
int cnt[maxn];
int num[maxn];

bool spfa()
{
queue<int>q;
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=1; i<=n; i++) dis[i]=inf;
dis[2]=0;
vis[2]=true;
q.push(2);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=1; i<=n; i++)
{
if(dis[i]>dis[u]+g[u][i]&&g[u][i]!=inf)
{
dis[i]=dis[u]+g[u][i];
if((++cnt[i])>n) return false;
if(!vis[i])
{
q.push(i);
vis[i]=true;
}
}
}
}
return true;
}

void dfs(int src)
{
if(src==2)
{
num[2]=1;
return ;
}
int sum=0;
for(int i=1; i<=n; i++)
{
if(g[src][i]!=inf&&dis[src]>dis[i])
{
if(num[i]>=0)
{
sum+=num[i];
}
else
{
dfs(i);
sum+=num[i];
}
}
}
num[src]=sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
scanf("%d",&m);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) g[i][j]=0;
else g[i][j]=inf;
}
}
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&d);
g[a][b]=g[b][a]=min(g[a][b],d);
}
spfa();
//printf("%d\n",dis[1]);
for(int i=1; i<=n; i++)
{
num[i]=-1;
}
dfs(1);
printf("%d\n",num[1]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: