uva 10917 A Walk through the Forest
2015-06-22 11:56
323 查看
先以终点为起点跑一遍Dijkstra,求出各点到终点的最短路,然后按要求重新建图,求路径条数。
设deg[u]为从顶点u出发到终点路径条数。则deg[u]+=deg[v],其中u->v为新图中的有向边。
初始化deg[2]=1,其余顶点为-1。
设deg[u]为从顶点u出发到终点路径条数。则deg[u]+=deg[v],其中u->v为新图中的有向边。
初始化deg[2]=1,其余顶点为-1。
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define maxn 1005 struct HeapNode{ //优先队列结点 int d,u; bool operator < (const HeapNode& rhs) const{ return d>rhs.d; } }; struct Edge{ //边 int from,to,dist; }; struct Dijkstra{ int n,m; //点数和边数 vector<Edge> edges; //边列表 vector<int> G[maxn]; //每个结点出发的边编号(从0开始) bool done[maxn]; //是否已永久标号 int d[maxn]; //s到各个点的距离 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}); m=edges.size(); G[from].push_back(m-1); } void dijkstra(int s){ //求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]=1; 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]=e.from; Q.push(HeapNode{d[e.to],e.to}); } } } } void output(int s,int e,vector<int>& path){ int pos=e; while(1){ path.push_back(pos); if(pos==s) break; pos=p[pos]; } } }; bool E[1005][1005]; int deg[1005]; int dfs(int n,int u){ if(deg[u]!=-1) return deg[u]; deg[u]=0; for(int i=1;i<=n;++i) if(E[u][i]) deg[u]+=dfs(n,i); return deg[u]; } int main() { int n,m,i,j,x,y,z; while(~scanf("%d",&n)&&n) { Dijkstra D; memset(E,0,sizeof(E)); memset(deg,-1,sizeof(deg)); D.init(n); scanf("%d",&m); while(m--){ scanf("%d%d%d",&x,&y,&z); D.addEdge(x,y,z); D.addEdge(y,x,z); } D.dijkstra(2); deg[2]=1; for(i=0;i<D.edges.size();i+=2){ Edge e=D.edges[i]; if(D.d[e.from]>D.d[e.to]) E[e.from][e.to]=1; else if(D.d[e.from]<D.d[e.to]) E[e.to][e.from]=1; } printf("%d\n",dfs(n,1)); } return 0; }
相关文章推荐
- C语言学习笔记(四)——函数(重点)
- FindWindow使用方法
- Android开发之Handler(五)回调函数拦截
- 绑定自定义类到Runtime(Lua-binding)
- groovy冒泡排序
- 图文详解MyEclipse中新建Maven webapp项目的步骤(很详细)
- Fragment在Android机顶盒上的应用
- 工作流学习——重要概念扫盲篇一步曲
- ARM装配说明MCR/MRC学习
- grails处理html表格一例
- Android-ScrollView中listview控件高度正确显示
- 69道Spring面试题和答案
- iOS 数据持久化五-Core Data
- grails配置外部数据库:这里的配置会覆盖datasource
- iOS 数据持久化四-SQLite3(1)
- yii关闭session
- 在查看源码时Eclipse提示source not found
- grails、groovy创建xml
- iOS 数据持久化四-SQLite3
- 【JavaScript】分秒倒计时器