您的位置:首页 > 其它

Poj 2449 Remmarguts' Date (第k短路)

2013-07-08 22:35 483 查看
题目链接:http://poj.org/problem?id=2449

题意:求第k短路

思路:A*启发式搜索。

从网上看的方法,还没有完全理解。

第K短路 - - ITeye技术网站
http://yzmduncan.iteye.com/blog/1162759
POJ 2449 A* K短路 - 梦想起航的地方 - 博客频道 - CSDN.NET
http://blog.csdn.net/mbxc816/article/details/7197228
#include <cstdio>
#include <cstring> 
#include <algorithm> 
#include <queue>
using namespace std;

#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))

const int INF = 0x3fffffff;  //权值上限
const int MAXPT = 1010;       //顶点数上限
const int MAXEG = 100000+200;     //边数上限

//点存储1~n
class Dijkstra     /*邻接表 + 优先队列 + Dijkstra求最短路*/
{
private:
	int n,e,e1;
    int dis[MAXPT],head[2][MAXPT];
    int visit[MAXPT];
	int cnt[MAXPT];   //启发式搜索标记

    struct Node
	{
		int v,dis,h;
        Node () {}
		Node (int _v,int _dis,int _h)
		{
			v=_v;
			dis=_dis;
			h=_h;
		}
		bool operator < (const Node a) const
		{
			return dis+h>a.dis+a.h;
		}
	};
	
	struct Edge
	{
		int v, w, next;
		Edge () {}
		Edge (int _v, int _next, int _w)
		{
			v=_v;
			next=_next;
			w=_w;
		}
    }edges[2][MAXEG];  //0存储原图,1存储反图

public:
    inline void init (int vx)
	{
        n = vx;
		e = 0,e1=0; 
        memset(head[0],-1,sizeof(int) * (vx + 1));
		memset(head[1],-1,sizeof(int) * (vx + 1));
    } 

    inline void Add (int u, int v, int w)
	{ 
        edges[0][e] = Edge(v, head[0][u], w);
        head[0][u] = e++;
    } 

	inline void Add1 (int u, int v, int w)
	{ 
        edges[1][e1] = Edge(v, head[1][u], w);
        head[1][u] = e1++;
    } 
  
    void dijkstra (int src)
	{ 
        Node first, next;
        priority_queue <Node> Q;
        for (int i=0;i<=n;i++)
		{ 
            dis[i] = INF; 
            visit[i] = false;
        } 
  
        dis[src]=0; 
        Q.push (Node(src, 0,0));
  
        while (!Q.empty())
		{ 
            first = Q.top(); 
            Q.pop(); 
            visit[first.v] = true;
  
            for (int i=head[1][first.v] ; i!=-1 ; i=edges[1][i].next)
			{ 
                if (visit[edges[1][i].v])
					continue; 
                next = Node(edges[1][i].v, first.dis + edges[1][i].w,0);
                if (next.dis < dis[next.v])
				{ 
                    dis[next.v] = next.dis; 
                    Q.push(next); 
                }
            }
        }
    }
       

	int Astar_Kth (int src,int end,int K)
	{
		Node first, next;
        priority_queue <Node> Q;
		memset (cnt,0,sizeof(cnt));
		if (dis[src]==INF) return -1;
		if (src==end) K++; //注意当s==t时需要计算K+1短路,因为s到t这条距离为0的路不能算在这K短路中,这时只需将K++

		Q.push (Node(src,0,dis[src]));

        while (!Q.empty())
		{ 
            first = Q.top();
            Q.pop();
            cnt[first.v]++;
			if (cnt[first.v]>K) continue;
			if (cnt[end]==K) return first.dis;

            for (int i=head[0][first.v] ; i!=-1 ; i=edges[0][i].next)
				Q.push(Node(edges[0][i].v,first.dis+edges[0][i].w,dis[edges[0][i].v]));
		}
		return -1;
	}
}ob; 

int main ()
{
#ifdef ONLINE_JUDGE
#else
	freopen("read.txt","r",stdin);
#endif
	int n,m,s,e,k;
    while (~scanf("%d%d",&n,&m))
	{
		ob.init(n);
		while (m--)
		{
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			ob.Add(u,v,w);
			ob.Add1(v,u,w);
        }
		scanf("%d%d%d",&s,&e,&k);
		ob.dijkstra(e);
		printf("%d\n",ob.Astar_Kth(s,e,k));
	}
	return 0; 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: