BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 ——Dijkstra+玄學

這個題玄學衝過,規定每個點訪問次數不能超過50次,然後找優先隊列中第二次到達終點t的狀態返回就ok

記錄一下,怕忘了

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
 
const int maxn=5010;
const int INF=0x3f3f3f3f;
struct HeapNode{
    int d,u;
    HeapNode(int _d,int _u):d(_d),u(_u){}
    bool operator <(const HeapNode &rhs)const{
        return d>rhs.d;
    }
};
struct Edge{
    int from,to;
    int w;
    Edge(int u,int v,int _w):from(u),to(v),w(_w){}
};
struct Dijkstra{
    vector<Edge>edges;
    vector<int>G[maxn];
    int vis[maxn];
    void add_edges(int u,int v,int cost){
        edges.push_back(Edge(u,v,cost));
        edges.push_back(Edge(v,u,cost));
        int m=edges.size();
        G[u].push_back(m-2);
        G[v].push_back(m-1);
    }
    int dij(int s,int t){
        memset(vis,0,sizeof(vis));
        int flag=0;
        priority_queue<HeapNode>Q;
        Q.push(HeapNode(0,s));
        vis[s]++;
        while(Q.size()){
            HeapNode x=Q.top();Q.pop();
            int u=x.u;
 
            if(u==t&&flag){
                return x.d;
            }
            if(u==t&&flag==0){
                flag=1;
            }
            for(int i=0;i<G[u].size();i++){
                Edge &e=edges[G[u][i]];
                if(vis[e.to]>50){
                    continue;
                }
                Q.push(HeapNode(x.d+e.w,e.to));
                vis[e.to]++;
            }
        }
        return -1;
    }
};
Dijkstra dijkstra;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        dijkstra.add_edges(u,v,w);
    }
    printf("%d\n",dijkstra.dij(1,n));
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章