首页 > 代码库 > 【poj2449】 Remmarguts' Date
【poj2449】 Remmarguts' Date
http://poj.org/problem?id=2449 (题目链接)
题意
求有向图K短路。
Solution
A*。g(x)为当前节点到起点的步数,h(x)为当前节点到终点的最短距离(也就是估价函数)。
细节
dijkstra求终点到各点最短路时要把边反向。原来起点和终点可以是同一个点,坑死了。。。
代码
// poj2499#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<queue>#define LL long long#define inf 2147483640#define Pi acos(-1.0)#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);using namespace std;const int maxn=100010;struct edge {int to,next,w;}e[maxn<<1];int head[maxn],cnts[maxn],dis[maxn],vis[maxn];int n,m,S,T,K,cnt,U[maxn],V[maxn],W[maxn];struct data { int num,w; friend bool operator < (const data a,const data b) { return a.w>b.w; }};struct node { int num,g,h; friend bool operator < (const node a,const node b) { return a.g+a.h>b.g+b.h; }};void link(int u,int v,int w) { e[++cnt]=(edge){v,head[u],w};head[u]=cnt;}void Dijkstra() { for (int i=1;i<=n;i++) dis[i]=inf;dis[T]=0; priority_queue<data> q; data x=(data){T,0};q.push(x); while (!q.empty()) { x=q.top();q.pop(); if (vis[x.num]) continue; vis[x.num]=1; for (int i=head[x.num];i;i=e[i].next) if (dis[e[i].to]>x.w+e[i].w) { dis[e[i].to]=e[i].w+x.w; q.push((data){e[i].to,dis[e[i].to]}); } }}int Astar() { node x=(node){S,0,dis[S]}; priority_queue<node> q;q.push(x); while (!q.empty()) { x=q.top();q.pop(); cnts[x.num]++; if (cnts[x.num]>K) continue; if (cnts[T]==K) return x.g; for (int i=head[x.num];i;i=e[i].next) q.push((node){e[i].to,x.g+e[i].w,dis[e[i].to]}); } return -1;}int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d%d",&U[i],&V[i],&W[i]); link(V[i],U[i],W[i]); } scanf("%d%d%d",&S,&T,&K); if (S==T) K++; Dijkstra(); memset(head,0,sizeof(head));cnt=0; for (int i=1;i<=m;i++) link(U[i],V[i],W[i]); int ans=Astar(); printf("%d",ans); return 0;}
【poj2449】 Remmarguts' Date
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。