hdu1142(最短路+DFS)
2017-08-08 21:35
106 查看
题目大意:寻找一共有多少条符合题意的路。能够从点A走到点B的要求是:点A到终点的最短路 > 点B到终点的最短路。 也就是说:从终点出发,求每一个点的最短路,然后那些最短路的值记录起来,作为能否通过的判断条件。最后用记忆化搜索来搜索出一共多少条符合要求的路。普通的dfs是超时的,bfs是超内存的。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int inf = 999999999;
int map[1005][1005];
int dis[1005],vis[1005];
int path[1005];
int n,m;
void Dijkstra(int src)
{
int i,j,minn,pos;
memset(vis,0,sizeof(vis));
for(i = 0; i<=n; i++)
dis[i] = map[src][i];
dis[src] = 0;
vis[src] = 1;
for(i = 1; i<=n; i++)
{
minn = inf;
pos = 0;
for(j = 1; j<=n; j++)
{
if(minn>dis[j] && !vis[j])
minn = dis[pos = j];
}
vis[pos] = 1;
for(j = 1; j<=n; j++)
if(dis[j]>dis[pos]+map[pos][j] && !vis[j])
dis[j] = dis[pos]+map[pos][j];
}
}
int DFS(int src)
{
if(path[src] !=-1)
return path[src];
if(src == 2)
return 1;
path[src] = 0;
for(int i = 1; i<=n; i++)
{
if(dis[i]<dis[src] && map[i][src]!=inf)
path[src]+=DFS(i);
}
return path[src];
}
int main()
{
int i,j,x,y,z;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
for(i = 0; i<=n; i++)
{
for(j = 0; j<=n; j++)
map[i][j] = inf;
map[i][i] = 0;
}
for(i = 0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y] = map[y][x] = z;
}
Dijkstra(2);
memset(path,-1,sizeof(path));
printf("%d\n",DFS(1));
}
return 0;
}
/*******************************
今天早点回去,想吹吹笛子了,最近喜欢看游记,买了瓦尔登湖的中英文版,希望可以坚持看完
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int inf = 999999999;
int map[1005][1005];
int dis[1005],vis[1005];
int path[1005];
int n,m;
void Dijkstra(int src)
{
int i,j,minn,pos;
memset(vis,0,sizeof(vis));
for(i = 0; i<=n; i++)
dis[i] = map[src][i];
dis[src] = 0;
vis[src] = 1;
for(i = 1; i<=n; i++)
{
minn = inf;
pos = 0;
for(j = 1; j<=n; j++)
{
if(minn>dis[j] && !vis[j])
minn = dis[pos = j];
}
vis[pos] = 1;
for(j = 1; j<=n; j++)
if(dis[j]>dis[pos]+map[pos][j] && !vis[j])
dis[j] = dis[pos]+map[pos][j];
}
}
int DFS(int src)
{
if(path[src] !=-1)
return path[src];
if(src == 2)
return 1;
path[src] = 0;
for(int i = 1; i<=n; i++)
{
if(dis[i]<dis[src] && map[i][src]!=inf)
path[src]+=DFS(i);
}
return path[src];
}
int main()
{
int i,j,x,y,z;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
for(i = 0; i<=n; i++)
{
for(j = 0; j<=n; j++)
map[i][j] = inf;
map[i][i] = 0;
}
for(i = 0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y] = map[y][x] = z;
}
Dijkstra(2);
memset(path,-1,sizeof(path));
printf("%d\n",DFS(1));
}
return 0;
}
/*******************************
今天早点回去,想吹吹笛子了,最近喜欢看游记,买了瓦尔登湖的中英文版,希望可以坚持看完
相关文章推荐
- A Walk Through the Forest(hdu1142,最短路+dfs)
- hdu1428漫步校园( 最短路+BFS(优先队列)+记忆化搜索(DFS))
- poj 3083 dfs+bfs最短路
- hdu 3768 Shopping(DFS+最短路)
- hdu1142(spfa+DFS记忆化)
- hdu 1572(dfs+最短路)
- 迷宫问题、最短路(BFS,DFS)
- 昂贵的聘礼 [DFS][最短路]
- 【最短路+dfs+dijkstra】杭电 hdu 1142 A Walk Through the Forest
- NYOJ 426 && poj 1125 最短路 DFS 判断联通 SPFA
- hdu 4771 求一点遍历所有给定点的最短路(bfs+dfs)
- ACM: 方向dfs + bfs求最短路 poj 3…
- *HDU1142 最短路+记忆化dfs
- hdu1385 最短路 floyd + dfs
- HDU1317 - XYZZY - 最短路判负环+dfs
- dfs求连通性,bfs求迷宫最短路
- poj 3009 dfs暴力解决最短路
- hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)
- 【PAT】甲级1018 - Public Bike Management(最短路 & dfs & 递归 & 好题)
- POJ - 1062昂贵的聘礼最短路或者DFS