zoukankan      html  css  js  c++  java
  • poj2449 Remmarguts' Date K短路 A*

    K短路裸题。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    struct Edge{
        int too, nxt, val;
    }edge[100005];
    struct Odge{
        int too, nxt, val;
    }odge[100005];
    struct Node{
        int idd, hfc, gfc;
        bool operator<(const Node &x)const{
            return hfc+gfc>x.hfc+x.gfc;
        }
    }d[1000005];//n*k
    int n, m, s, t, k, uu, vv, ww, hea[1005], oea[1005], cnt, ont, dis[1005];
    int din, tms[1005], ans;
    bool vis[1005];
    void add_edge(int fro, int too, int val){
        edge[++cnt].nxt = hea[fro];
        edge[cnt].too = too;
        edge[cnt].val = val;
        hea[fro] = cnt;
    }
    void add_odge(int fro, int too, int val){
        odge[++ont].nxt = oea[fro];
        odge[ont].too = too;
        odge[ont].val = val;
        oea[fro] = ont;
    }
    void dijkstra(){
        memset(dis, 0x3f, sizeof(dis));
        dis[t] = 0;
        for(int i=1; i<=n; i++){
            int mini=0;
            for(int j=1; j<=n; j++)
                if(!vis[j] && dis[mini]>dis[j])
                    mini = j;
            vis[mini] = true;
            if(!mini)   return ;
            for(int i=oea[mini]; i; i=odge[i].nxt){
                int v=odge[i].too;
                dis[v] = min(dis[v], odge[i].val+dis[mini]);
            }
        }
    }
    void aStar(){
        d[++din] = (Node){s, 0, 0};
        while(din){
            Node j=d[1];
            pop_heap(d+1, d+1+din);
            din--;
            tms[j.idd]++;
            if(j.idd==t && tms[t]==k){
                printf("%d
    ", j.hfc+j.gfc);
    			return ;
            }
            if(tms[j.idd]>k)    continue;
            for(int i=hea[j.idd]; i; i=edge[i].nxt)
    			if(tms[edge[i].too]<=k){
        	        d[++din] = (Node){edge[i].too, j.hfc+edge[i].val, dis[edge[i].too]};
            	    push_heap(d+1, d+1+din);
            	}
        }
    	cout<<"-1
    ";
    }
    int main(){
        cin>>n>>m;
        for(int i=1; i<=m; i++){
            scanf("%d %d %d", &uu, &vv, &ww);
            add_edge(uu, vv, ww);
            add_odge(vv, uu, ww);
        }
    	cin>>s>>t>>k;
    	if(s==t)	k++;
        dijkstra();
        aStar();
        return 0;
    }
    
  • 相关阅读:
    LeetCode OJ-- Spiral Matrix II
    LeetCode OJ-- Reverse Integer
    LeetCode OJ-- Spiral Matrix
    LeetCode OJ-- Trapping Rain Water*
    LeetCode OJ--Triangle **
    LeetCode OJ-- Sqrt(x) *
    LeetCode OJ-- Simplify Path **
    lol人物模型提取(一)
    3ds Max学习日记(九)
    YaoLingJump开发者日志(八)V1.1版本完成
  • 原文地址:https://www.cnblogs.com/poorpool/p/7967148.html
Copyright © 2011-2022 走看看