您的位置:首页 > 其它

Poj 2449 Remmarguts' Date(Astar K短路)

2011-08-13 12:24 471 查看
题目链接:http://poj.org/problem?id=2449



求各点到目的地之间的最短路,以此为h,进行A*搜索,待目的地入队k次,当前路程即为k短路



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>

using namespace std;

#define N 1100
#define M 201008
#define Inf 0x7ffffff
typedef struct{
	int v,c,nxt;
}Edge;
typedef struct talQ{
	int v,d,h;
	bool operator <(const talQ &a)const
	{return a.d+a.h<d+h;}
}Q;

Edge edg[M];
int tail
;
int head
;
int h
;
int vis
;
int n,m,e;
int s,t,k;

void AddEdge(int u,int v,int c)
{
	edg[e].v=v;edg[e].c=c;edg[e].nxt=head[u];head[u]=e++;
	edg[e].v=u;edg[e].c=c;edg[e].nxt=tail[v];tail[v]=e++;
}

void Dijkstra()
{
	int i,j,c,v;
	int tmp,min;

	memset(vis,0,sizeof(vis));
	for(i=0;i<=n;i++)
		h[i]=Inf;
	h[t]=0;
	for(i=0;i<n;i++){
		min=Inf,c=0;
		for(j=1;j<=n;j++){
			if(vis[j]) continue;
			if(h[j]<min)
				min=h[j],c=j;
		}
		if(c==0) break;
		vis[c]=1;
		for(tmp=tail[c];tmp!=-1;tmp=edg[tmp].nxt){
			v=edg[tmp].v;
			if(h[v]-edg[tmp].c>h[c])
				h[v]=h[c]+edg[tmp].c;
		}
	}
}

int Astarkth()
{
	Q cur,nxt;
	priority_queue<Q>q;
	int tmp,v;

	if(h[s]==Inf) return -1;

	memset(vis,0,sizeof(vis));
	cur.d=0;cur.v=s;cur.h=h[s];
	q.push(cur);
	while(!q.empty()){

		cur=q.top();q.pop();
		vis[cur.v]++;
		if(vis[cur.v]>k) continue;
		if(vis[t]==k) return cur.d;
		for(tmp=head[cur.v];tmp!=-1;tmp=edg[tmp].nxt){
			v=edg[tmp].v;
			nxt.d=edg[tmp].c+cur.d;
			nxt.v=v;nxt.h=h[v];
			q.push(nxt);
		}
	}
	return -1;
}

int main()
{
	int i;
	int u,v,c;
	scanf("%d%d",&n,&m);
	for(i=0;i<=n;i++)
		head[i]=tail[i]=-1;

	while(m--){
		scanf("%d%d%d",&u,&v,&c);
		AddEdge(u,v,c);
	}
	scanf("%d%d%d",&s,&t,&k);
	if(s==t) k++;
	Dijkstra();
	printf("%d\n",Astarkth());
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: