HDU
来源:互联网 发布:樱井知香的第一部片 编辑:程序博客网 时间:2024/06/08 20:18
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1142
题目的意思真的十分的难理解,刚开始以为是让求最短路径有几条,后来看了题解才知道是让求 1 到 2 的路上不绕远路的路有几条,就是每一步都要更接近终点一些。就是每次要从A到B点前要先判断B点距离终点是否比A点距离终点要来的近,然后A到B直接必须是有路的。
最短路的话用Dijkstra或者spfa都可以写,然后图是无向图,顶点也不是很多,可以直接用邻接矩阵来存,算出2到其他各点的最短路,再进行搜索,从1开始,2结束,然后有很多地方会重复搜,可以标记一下,就是用记忆化搜索。
#include<iostream>#include<string.h>#include<stdio.h>#include<queue>using namespace std;const int inf = 2147483647,maxn = 1010;int n,m,mp[maxn][maxn],dist[maxn],ans[maxn];struct node{ int num,dist; node(int a,int b) { num = a; dist = b; } friend bool operator < (node a,node b) { return a.dist > b.dist; }};void dij_up(){ node s(2,0) ; priority_queue<node>q; q.push(s); while(!q.empty()) { s = q.top(); q.pop(); if(s.dist>dist[s.num]) continue; for(int i=1;i<=n;i++) { if(mp[s.num][i]<inf&&dist[i]>dist[s.num]+mp[s.num][i]) { dist[i] = dist[s.num]+mp[s.num][i]; q.push(node(i,dist[i])); } } }}int dfs(int x){ if(ans[x]) return ans[x]; int sum = 0; for(int i=1;i<=n;i++) { if(mp[x][i] < inf && dist[i] < dist[x]) sum += dfs(i); } return ans[x] = sum;}int main(){ while(scanf("%d",&n)&&n) { for(int i=0;i<=n;i++) { dist[i] = inf; for(int j = 0;j<=n;j++) { mp[i][j] = inf; } } memset(ans,0,sizeof ans); scanf("%d",&m); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); mp[a][b] = mp[b][a] = c; } dist[2] = 0; dij_up(); ans[2] = 1; dfs(1); printf("%d\n",ans[1]); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- email邮箱登陆验证实例
- 关于ubuntu服务器tomcat启动很慢的解决
- android HAL层代码
- linux基本命令及操作5(用户管理)
- 23种设计模式之——责任链模式
- HDU
- Android-Studio多个项目添加依赖同一个模块
- 如何防止头文件被重复包含、嵌套包含
- SpringBoot看书笔记(1)
- View的事件分发
- C++接口实现总结(Interface)
- 集合工具类之Set特点和实现类的详解
- 动态规划题目整合
- APP生产线构建------ErrorProne实施