最短路SPFA+DP+uva10917
来源:互联网 发布:php rbac权限管理系统 编辑:程序博客网 时间:2024/05/30 04:29
Problem C: A Walk Through the Forest
Jimmy experiences a lot of stress at work these days, especially sincehis accident made working difficult. To relax after a hard day, helikes to walk home. To make things even nicer, his office is on oneside of a forest, and his house is on the other. A nice walk throughthe forest, seeing the birds and chipmunks is quite enjoyable.The forest is beautiful, and Jimmy wants to take a different routeeveryday. He also wants to get home before dark, so he always takes apath to make progress towards his house. He considers taking apath fromA to B to be progress if there existsa route from B to his home that is shorter thanany possible route fromA.Calculate how many different routes through the forest Jimmy might take.
Input
Input contains several test cases followed by a line containing 0.Jimmy has numbered each intersection or joining of paths starting with 1.His office is numbered 1, and his house is numbered 2. Thefirst line of each test case gives the number of intersectionsN,1 < N ≤ 1000, and the number of paths M.The followingM lines each containa pair of intersections a b and an integerdistance1 ≤ d ≤ 1000000 indicating a path of length dbetween intersectiona and a different intersection b.Jimmy may walk a path any direction he chooses.There is at most one path between any pair of intersections.Output
For each test case, output a single integer indicating the number of different routesthrough the forest. You may assume that this number does notexceed 2147483647.Sample Input
5 61 3 21 4 23 4 31 5 124 2 345 2 247 81 3 11 4 13 7 17 4 17 5 16 7 15 2 16 2 10
Output for Sample Input
24思路:从终点求一次最短路,然后记忆话搜索求路径条数。
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=1010;const int INF=1000000000;int n,m,num;int dis[maxn],head[maxn],d[maxn];bool vis[maxn];struct node{ int v,next,f;}edge[maxn*100];void init(){ num=0; memset(head,-1,sizeof(head)); memset(d,-1,sizeof(d));}void add_edge(int x,int y,int f){ edge[num].v=y; edge[num].next=head[x]; edge[num].f=f; head[x]=num++;}void SPFA(int s){ for(int i=0;i<=n;i++) { dis[i]=INF; vis[i]=0; } queue<int> q; q.push(s); vis[s]=1; dis[s]=0; while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v,w=edge[i].f; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; if(!vis[v]) { q.push(v); vis[v]=1; } } } }}int DP(int u){ int & ans=d[u]; if(ans!=-1)return d[u]; ans=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dis[v]<dis[u]) ans+=DP(v); } return ans;}int main(){ freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF,n) { init(); scanf("%d",&m); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c); add_edge(b,a,c); } SPFA(2); d[2]=1; DP(1); printf("%d\n",d[1]); } return 0;}
0 0
- 最短路SPFA+DP+uva10917
- dp加最短路spfa
- spfa+dp(洛谷1144 最短路计数)
- POJ1724 ROADS [最短路变形 二维dp+spfa]
- BZOJ 1003 物流运输【dp+最短路SPFA】好题!
- bzoj 1003 [ZJOI2006]物流运输(最短路spfa+dp)
- SPFA最短路
- 最短路之SPFA
- poj2472最短路spfa
- 最短路SPFA--poj3013
- 最短路 SPFA模板
- 最短路 SPFA
- 最短路spfa
- 最短路SPFA
- 最短路--SPFA算法
- 最短路SPFA算法
- 最短路SPFA
- 最短路SPFA
- add Redo logs/dorp redo logs in Physical Standby
- cocos2d 3.2 生成Android项目文件问题 Invalid APP_STL value: c++_static
- 使用GIT进行源码管理——GIT托管服务
- 【转】Android BLE开发之Android手机与BLE终端通信
- delphi 中access数据库实现多库连接查询
- 最短路SPFA+DP+uva10917
- sgu112 高精度(用java水啊水)
- 用集算器解多元一次方程组
- 做程序猿的老婆应该注意的一些事情
- <s:checkboxlist根据action中传来的值默认选中
- 大数四则运算
- CPU指令集介绍
- 关于HTTPSession的问题
- 使用C++创建链表