码迷,mamicode.com
首页 > 其他好文 > 详细

【poj2449】 Remmarguts' Date

时间:2016-12-27 23:00:34      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:jks   ext   name   距离   out   cstring   inf   can   using   

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

标签:jks   ext   name   距离   out   cstring   inf   can   using   

原文地址:http://www.cnblogs.com/MashiroSky/p/6227436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!