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;
}
#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;
}
相关文章推荐
- HDOJ-1142-A Walk Through the Forest
- HDOJ 题目1142 A Walk Through the Forest(spfa dfs)
- HDOJ 1142 A Walk Through the Forest(最短路+记忆化搜索)
- HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】
- HDOJ/HDU 1142 A Walk Through the Forest
- hdoj 1142 A Walk Through the Forest(记忆化搜索+最短路)
- hdoj 1142 A Walk Through the Forest 【dijkstra + dfs】
- HDOJ1142 A Walk Through the Forest
- HDOJ-1142 A Walk Through the Forest
- HDoj 1142 A Walk Through the Forest(记忆化收索+dijik)
- hdoj 1142 A Walk Through the Forest
- hdoj 1142 A Walk Through the Forest
- HDOJ 1142 A Walk Through the Forest
- HDU 1142 A Walk Through the Forest (SPFA+记忆化搜索)
- hdu 1142 A Walk Through the Forest
- Hdu 1142 A Walk Through the Forest
- HDU 1142 A Walk Through the Forest (记忆化搜索+Dijkstra算法)
- HDU 1142 A Walk Through the Forest
- HDU 1142 A Walk Through the Forest(SPFA+记忆化搜索DFS)
- hdu 1142 A Walk Through the Forest (Dijkstra + 记忆化搜索)