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

Posted garrettwale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于HDOJ-4725(Dijikstra算法+拆点求最短路)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3488--Tour(KM or 费用流)

基于cache和不拆点的优化算法

POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

广度优先搜索及其应用

2019/10/2 图论测试小结

CodeForces 937D 936BSleepy Game 有向图判环,拆点,DFS