poj 2449 第k短路
2013-09-03 11:44
309 查看
题目链接:http://poj.org/problem?id=2449
View Code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn = 1005; const int maxe = 100050; const int INF = 0x3f3f3f3f; struct Edge{ int v,w; int next; Edge(int v=0,int w=0,int next=0): v(v), w(w), next(next){} }; struct Heap{ int u,f,g; Heap(int u=0,int f=0,int g=0): u(u), f(f), g(g){} bool operator < (const Heap& rhs) const{ return f > rhs.f; } }; int dist[maxn]; struct Dijkstra{ Edge edges[maxe]; int head[maxn],cnt; bool vis[maxn]; void init(){ memset(head,-1,sizeof(head)); cnt = 0; } void addedge(int u,int v,int w){ edges[cnt] = Edge(v,w,head[u]); head[u] = cnt++; } void solve(int s){ memset(vis,0,sizeof(vis)); memset(dist,0x3f,sizeof(dist)); priority_queue<Heap> Q; Q.push(Heap(s,0,0)); dist[s] = 0; while(!Q.empty()){ Heap temp = Q.top(); Q.pop(); int u = temp.u; int d = temp.f; if(vis[u]) continue; vis[u] = true; for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(dist[e.v] > d + e.w){ dist[e.v] = d + e.w; Q.push(Heap(e.v,dist[e.v],0)); } } } } }solver1; struct A_Star{ Edge edges[maxe]; int head[maxn],cnt; int num[maxn]; void init(){ memset(head,-1,sizeof(head)); cnt = 0; } void addedge(int u,int v,int w){ edges[cnt] = Edge(v,w,head[u]); head[u] = cnt++; } int solve(int s,int t,int k){ memset(num,0,sizeof(num)); priority_queue<Heap> Q; if(dist[s] >= INF) return -1; Q.push(Heap(s,dist[s],0)); while(!Q.empty()){ Heap temp = Q.top(); Q.pop(); int u = temp.u; num[u]++; if(num[t] == k){ return temp.f; } if(num[u] > k){ continue; } for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; int g = temp.g + e.w; int f = g + dist[e.v]; Q.push(Heap(e.v,f,g)); } } return -1; } }solver2; int main() { //freopen("E:\\acm\\input.txt","r",stdin); int N,M; cin>>N>>M; solver1.init(); solver2.init(); for(int i=1;i<=M;i++){ int u,v,w; scanf("%d %d %d",&u,&v,&w); solver1.addedge(v,u,w); solver2.addedge(u,v,w); } int s,t,k; scanf("%d %d %d",&s,&t,&k); solver1.solve(t); if(s == t) k++; int ans = solver2.solve(s,t,k); printf("%d\n",ans); }
View Code
相关文章推荐
- poj 2449 Remmarguts' Date 第K短路
- POJ 2449 Remmarguts' Date ( Dijkstra + A* 求解第K短路 )
- poj 2449 Remmarguts' Date 求第k短路(SPFA+A*)
- poj 2449 第k短路 A* + spfa
- POJ 2449 Remmarguts' Date 第K短路 A* + SPFA
- 搜索 ( 第K短路, A*搜索)——Remmarguts' Date ( POJ 2449 )
- poj 2449(A*求第K短路)
- poj 2449 求第k最短路 A* + SPFA
- poj 2449 Remmarguts' Date 第k短路 A*+spfa 解题报告
- [第K短路]POJ_2449_Remmarguts' Date
- [POJ 2449] Remmarguts' Date 第K短路
- POJ 2449 第k短路 Dijkstra+A*
- poj2449 第k短路 (单源最短路径+A*)
- poj 2449 (第K短路) A* + dij
- <A*算法模板>poj 2449 第k短路
- POJ 2449 Remmarguts' Date (第k短路)
- POJ 2449 第k短路 Dijkstra+A*
- POJ 2449 Remmarguts' Date (求第K短路,A* + Dijkstra)
- Poj 2449 Remmarguts' Date (第k短路)
- Remmarguts' Date----POJ_2449----第k最短路