• 【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;
    }
    

      

  • 相关阅读:
    Animate.css 一款强大的预设css3动画库
    关于js返回上一页的实现方法
    jquery判断字符串中是否包含特定字符的方法总结
    去掉select在苹果手机上的原生样式
    html5中如何去掉input type date默认样式
    JS和jQuery中ul li遍历获取对应的下角标
    滚动一定的高度底色递增
    喵哈哈村的狼人杀大战(5)
    喵哈哈村的狼人杀大战(2)
    One Card Poker
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6227436.html
Copyright © 2020-2023  润新知