POJ 2449 A*k短路
2016-09-08 19:45
393 查看
题意:给出一个有向图,起点终点以及k,求k短路
思路:使用A*算法,首先预处理出每个点到终点的距离h[i],搜索时使用优先队列,关键字为(f + h[i]),其中f 是已经走的距离,i是当前走到的节点
注意:此题坑点巨多:
1)起点可能与终点相同,此时0不算最短路,故k++
2)k短路不存在时,输出-1
3)由于是有向图,从Dijkstra时只能用反边,A*时只能用正边,否则MLE
^_^
by:dds
http://blog.csdn.net/dy0607/article/details/52423809
思路:使用A*算法,首先预处理出每个点到终点的距离h[i],搜索时使用优先队列,关键字为(f + h[i]),其中f 是已经走的距离,i是当前走到的节点
注意:此题坑点巨多:
1)起点可能与终点相同,此时0不算最短路,故k++
2)k短路不存在时,输出-1
3)由于是有向图,从Dijkstra时只能用反边,A*时只能用正边,否则MLE
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> using namespace std; const int maxn=1010; const int INF=1e9; vector<int>g[maxn],w[maxn]; vector<bool>P[maxn]; struct node{ int id,w; bool operator <(const node &A)const{ return w>A.w; } }; int vis[maxn],dis[maxn]; int n,m; void add(int x,int y,int z,int p){ g[x].push_back(y); w[x].push_back(z); P[x].push_back(p); } void dijkstra(int st){ for(int i=1;i<=n;i++) vis[i]=0,dis[i]=INF; priority_queue<node>q; dis[st]=0; q.push((node){st,0}); while(!q.empty()){ int s=q.top().id,G=q.top().w; q.pop(); if(vis[s]) continue; vis[s]=1; for(int i=0;i<g[s].size();i++){ int v=g[s][i]; if(!P[s][i] && dis[v]>G+w[s][i]){ dis[v]=G+w[s][i]; q.push((node){v,dis[v]}); } } } } struct data{ int pos,d; bool operator <(const data &A)const{ return d+dis[pos]>A.d+dis[A.pos]; } }; int A_star(int k,int st,int ed){ memset(vis,0,sizeof(vis)); priority_queue<data> q; q.push((data){st,0}); while(!q.empty()){ data s=q.top();q.pop(); int u=s.pos; vis[u]++; if(vis[ed]==k) return s.d; if(vis[u]>k) continue; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(P[u][i]) q.push((data){v,s.d+w[u][i]}); } } return -1; } int main(){ int st,ed,k; int i,j; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z,1); add(y,x,z,0); } scanf("%d%d%d",&st,&ed,&k); if(st==ed) k++; dijkstra(ed); printf("%d\n",A_star(k,st,ed)); return 0; }
^_^
by:dds
http://blog.csdn.net/dy0607/article/details/52423809
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- [强连通分量]poj2186_Popular Cows
- POJ1050 最大子矩阵和