您的位置:首页 > 其它

HDOJ1142 A Walk Through the Forest

2014-04-14 18:21 246 查看
#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;

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