HDOJ1142 A Walk Through the Forest

#include<iostream>
#include<cstring>
#define INF 0xfffffff
#define NUM 1001
using namespace std;


int N, M, count = 0;
int arr[NUM][NUM], dist[NUM], isvisited[NUM] = {0}, map[NUM][NUM] = {0}, issearch[NUM] = {0}, dp[NUM];

int dfs(int node)  
{  
    if(dp[node] != -1)  
        return dp[node];  
    if(node == 2)  
        return 1;  
    dp[node]=0;  
    for(int i=1;i<=N;i++)  
        if(arr[i][node]!=INF && dist[i]<dist[node])  
            dp[node] += dfs(i);  
    return dp[node];  //dp[node]存储的是从2到node的最短路径数目  

int main()
{
while(cin>>N && N){
cin>>M;
count = 0;
memset(map, 0, sizeof(map));
memset(isvisited, 0, sizeof(isvisited));
memset(arr, 0, sizeof(arr));
memset(dist, 0, sizeof(dist));
memset(issearch, 0, sizeof(issearch));
memset(dp, -1, sizeof(dp));
for(int i = 1; i <= N; i++){
dist[i] = INF;
for(int j = 1; j <= N; j++){
if(i == j)
arr[i][j] = 0;
else
arr[i][j] = INF;
}
}
dist[2] = 0;
for(int i = 1; i <= M; i++){
int x, y, xy;
cin>>x>>y>>xy;
arr[x][y] = xy;
arr[y][x] = xy;
}
//discstra
for(int i = 1; i <= N; i++){
int mark = -1, min = INF;
for(int j = 1; j <= N; j++){
if(!isvisited[j] && min > dist[j]){
mark = j;
min = dist[j];
}
}
isvisited[mark] = 1;
for(int j = 1; j <= N; j++){
if(!isvisited[j] && dist[j] > dist[mark]+arr[mark][j])
dist[j] = dist[mark]+arr[mark][j];
}
}
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
if(dist[i] > dist[j])
map[i][j] = 1;
}
}
//issearch[1] = 1;
//DFS(1);
//cout<<count<<endl;
cout<<dfs(1)<<endl;
}
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值