HDOJ-4725(Dijikstra算法+拆点求最短路)

The Shortest Path in Nya Graph

HDOJ-4725

  • 这题是关于最短路的问题,但是和常规的最短路有点不同的就是这里多了层次这一结构。
  • 为了解决这一问题可以把每一层抽象或者划分为两个点:入点和出点。
  • 对于每个点,将所在层的入点和该点相连,再将该点和所在层的出点相连,权值都为0.
  • 对于每一层,将该层的出点和上面一层,以及下面一层的入点相连,取值就是题目给的c。
  • 对于其余的路径,则按照题意进行连接就行了。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
const int INF=0X3F3F3F3F;
const int maxn=300005;
int n,m,c;
struct edge{
    int to;
    int cost;
};
struct node{
    int dis;
    int to;
    bool operator<(const node& t)const{
        return dis>t.dis;
    }
};
int d[maxn];
vector<edge> edges[maxn];
int dijikstra(int s){
    priority_queue<node> q;
    memset(d,INF,sizeof(d));
    d[s]=0;
    q.push({0,s});
    while(!q.empty()){
        node now=q.top();
        q.pop();
        int v=now.to;
        int dis=now.dis;
        if(d[v]<dis)
            continue;
        for(int i=0;i<edges[v].size();i++){
            int u=edges[v][i].to;
            int cost=edges[v][i].cost;
            if(d[u]>d[v]+cost){
                d[u]=d[v]+cost;
                q.push({d[u],u});
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    int k=0;
    while(t--){
        cin>>n>>m>>c;
        int layer;
        for(int i=1;i<=maxn;i++){
            edges[i].clear();
        }
        for(int i=1;i<=n;i++)
        {
            cin>>layer;
            edges[i].push_back({n+(layer<<1),0});//当前点向该层的出点连边
            edges[n+(layer<<1|1)].push_back({i,0});//该层的入点和当前点连边
        }
        for(int i=1;i<=n;i++){//总共有n层
            edges[n+(i<<1)].push_back({n+((i+1)<<1|1),c});
            edges[n+(i<<1)].push_back({n+((i-1)<<1|1),c});
        }
        int from,to,cost;
        for(int i=0;i<m;i++){
            cin>>from>>to>>cost;
            edges[from].push_back({to,cost});
            edges[to].push_back({from,cost});
        }
        dijikstra(1);
        cout<<"Case #"<<++k<<": ";
        if(d[n]==INF)
            cout<<-1<<endl;
        else
            cout<<d[n]<<endl;
    }
    return 0;

}
posted @ 2019-09-05 12:05  Garrett_Wale  阅读(180)  评论(0编辑  收藏  举报