UVA 10917(p330)----Walk through the Forest
2016-03-10 22:09
330 查看
#include<bits/stdc++.h> #define debu using namespace std; const int INF=1e10; const int maxn=1e3+50; struct Edge { int from,to,dist; Edge(int a=0,int b=0,int c=0):from(a),to(b),dist(c) {} }; struct HeapNode { int d,u; HeapNode(int a=0,int b=0):d(a),u(b) {} bool operator < (const HeapNode& rhs) const { return d>rhs.d; } }; int d[maxn]; vector<Edge> edges; vector<int> G[maxn]; struct Dijkstra { int n,m; bool done[maxn]; int p[maxn]; void init(int n) { this->n=n; for(int i=0; i<n; i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int dist) { edges.push_back(Edge(from,to,dist)); int m=edges.size(); G[from].push_back(m-1); } void dijkstra(int s) { priority_queue<HeapNode> q; for(int i=0; i<n; i++) d[i]=INF; d[s]=0; memset(done,0,sizeof(done)); q.push(HeapNode(0,s)); while(!q.empty()) { HeapNode x=q.top(); q.pop(); int u=x.u; if(done[u]) continue; done[u]=true; for(int i=0; i<G[u].size(); i++) { Edge& e=edges[G[u][i]]; if(d[e.to]>d[u]+e.dist) { d[e.to]=d[u]+e.dist; p[e.to]=G[u][i]; q.push(HeapNode(d[e.to],e.to)); } } } } }; int n,m; int f[maxn]; Dijkstra ans; vector<int> g[maxn]; void make() { // cout<<edges.size()<<endl; /* for(int i=0;i<n;i++) cout<<i<<" "<<d[i]<<endl;*/ for(int i=0;i<edges.size();i++) { Edge e=edges[i]; // cout<<e.from<<" "<<e.to<<endl; int u=e.from,v=e.to; if(d[v]<d[u]) { // cout<<"flag "<<u<<" "<<v<<endl; g[u].push_back(v); } } } int solve(int u) { int sum=0; if(f[u]!=-1) return f[u]; for(int i=0; i<g[u].size(); i++) sum+=solve(g[u][i]); return f[u]=sum; } int main() { #ifdef debug freopen("in.in","r",stdin); #endif // debug while(scanf("%d%d",&n,&m)==2&&n) { ans.init(n); for(int i=0; i<n; i++) g[i].clear(); memset(f,-1,sizeof(f)); for(int i=0; i<m; i++) { int x,y,w; scanf("%d%d%d",&x,&y,&w); x--;y--; ans.AddEdge(x,y,w); ans.AddEdge(y,x,w); } ans.dijkstra(1); make(); f[1]=1; solve(0); printf("%d\n",f[0]); } return 0; }
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1858
题解:对于题目规定路径,即指d[B]<d[A],因此建立一个新图,当且仅当d[B]<d[A]时加入有向边A->B,则ans等于新图中起点到终点的路径条数。f[u]=sum(f[v])(v为u的后继结点,f[1]=1)记忆化搜索即可。
相关文章推荐
- 分治法与递归编程步骤
- 初刷leetcode编程题总结
- 工作4年的程序员折腾之路
- 组件基础和COM接口
- Java基础复习系列一
- OSChina AlphaAnimation
- 对在线教育的一点感触
- 读《我是一只IT小小鸟》有感
- 27735: 死亡拆分II
- 初探nginx架构
- Hibernate学习——(五)基于Annotation的一对一外键映射
- Spring MVC 基于URL的映射规则(注解版)
- BZOJ4415 [SHOI2013] 发牌
- c++基础知识
- Android四大组件之一服务
- C++ DirectX 游戏开发中级视频教程 06 资源下载链接
- Servlet 是否线程安全 看完便知
- nginx配置中location匹配规则
- linux下lnmp网站搭建
- python引入PIL做验证码,发现字体不支持的解决办法