HDU 1142 A Walk Through the Forest(SPFA+记忆化搜索DFS)
2024-10-15 05:33:29
题意 :办公室编号为1,家编号为2,问从办公室到家有多少条路径,当然路径要短,从A走到B的条件是,A到家比B到家要远,所以可以从A走向B 。
思路 : 先以终点为起点求最短路,然后记忆化搜索。
//
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
const int INF = << ;
using namespace std ; int N,M ;
int mapp[][] ,pre[],dist[];
bool vis[] ; void spfa(int src)
{
for(int i = ; i <= N ; i++)
{
vis[i] = false ;
dist[i] = INF ;
}
queue<int>Q ;
dist[src] = ;
vis[src] = true ;
Q.push(src) ;
while(!Q.empty())
{
int u = Q.front() ;
Q.pop() ;
vis[u] = false ;
for(int i = ; i <= N ; i++)
{
if(dist[i] > dist[u] + mapp[u][i] && mapp[u][i] != INF)
{
dist[i] = dist[u] + mapp[u][i] ;
if(!vis[i])
{
vis[i] = true ;
Q.push(i) ;
}
}
}
}
}
int dfs(int s)
{
if(pre[s]) return pre[s];
if(s == ) return ;
int cnt = ;
for(int i = ;i <= N ; i++)
{
if(mapp[s][i] < INF && dist[s] > dist[i])
{
if(pre[i]) cnt += pre[i];//已经找过了
else cnt += dfs(i);
}
}
pre[s] = cnt ;
return pre[s];
}
void Init()
{
for(int i = ; i <= N ; i++)
for(int j = ; j <= N ; j++)
{
if(i == j) mapp[i][j] = ;
else mapp[i][j] = INF ;
}
memset(pre,,sizeof(pre)) ;
}
int main()
{
while(cin >> N)
{
if(N == ) break ;
cin >> M ;
Init() ;
int u,v,w ;
while(M--)
{
cin >> u >> v >> w ;
mapp[u][v] = mapp[v][u] = w ;
}
spfa() ;
cout << dfs() << endl ;
}
return ;
}
最新文章
- 基于jquery封装的颜色下拉选择框
- 一次诡异的TOMCAT启动故障的解决
- android studio 乱码
- C primer plus 练习题 第一章
- TortoiseGit 的使用
- 分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)
- Mingyang.net:注解配置Hibernate时报错Unknown Entity
- inflate方法与findViewById的区别
- oracle16 例外
- ural 1353. Milliard Vasya&#39;s Function
- 当nginx 500 伪静态错误时,记录解决方法rewrite or internal redirection cycle while processing
- xhprof
- java list基本用法
- 复习java7 集合的底层实现理解
- AngularJS复习------表单验证
- Java高级应用简笔
- Python BeautifulSoup 使用
- 【.NET】using 语句中使用的类型必须可隐式转换为";System.IDisposable";
- webpack配置的基本介绍
- OC学习笔记