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算法+拆点求最短路)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]