HDU 4725 The Shortest Path in Nya Graph(spfa+虚拟点建图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725
题目大意:有n层,n个点分布在这些层上,相邻层的点是可以联通的且距离为c,还有额外给出了m个条边,求1号点到n号点的最短距离,若无法到达则输出“-1”。
解题思路:最短路问题,主要是建图很难。如果按常规建法,用邻接表存每层的节点编号然后在建边肯定会超时,因为如果点只分布在两个层上,那建边的复杂度就是O(n^2)了。所以要改变一下思路,可以用n个虚拟点来代表n层,把连到该层的点都连接到虚拟点上,同一层花费为0,不同层花费为c。但是还需要一点处理,不然这样的话同一层的点的花费就会变成0,原本可能不可达的变得可达。这是我从别人博客看来的两种方法(出处):
A.每层拆两个点,一个点管入,一个点管出,这样的话同层的点不会回到同层的另外一个点上。
B.每层拆一个点,这个点只管入,而处于该层的点则向左右两层虚拟点相连。
我用的是方法B,建了2n个点(有n个是虚拟点),边数大概为5n条(点和点2n,点和相邻层2n,虚拟点到同层的点n)
代码:
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
const int INF=0x3f3f3f3f; struct node{
int to,next,w;
}edge[*N]; int n;
int idx,head[N],dis[N],layer[N];//layer[i]记录第i个点所在的层
bool vis[N],sign[N];//sign[i]记录第i层是否有点 void init(){
idx=;
memset(head,-,sizeof(head));
} void addEdge(int u,int v,int w){
edge[idx].to=v;
edge[idx].w=w;
edge[idx].next=head[u];
head[u]=idx;
idx++;
} void spfa(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,false,sizeof(vis));
dis[s]=;
queue<int>q;
q.push(s);
while(!q.empty()){
int k=q.front();
q.pop();
vis[k]=false;
for(int i=head[k];i!=-;i=edge[i].next){
node t=edge[i];
if(dis[k]+t.w<dis[t.to]){
dis[t.to]=dis[k]+t.w;
if(!vis[t.to]){
q.push(t.to);
vis[t.to]=true;
}
}
}
}
} int main(){
int t,cas=;
scanf("%d",&t);
while(t--){
init();
memset(sign,false,sizeof(sign));
int m,c;
scanf("%d%d%d",&n,&m,&c);
for(int i=;i<=n;i++){
scanf("%d",&layer[i]);
sign[layer[i]]=true;
}
for(int i=;i<=n-;i++){ //相邻层的虚拟点建边
if(sign[i]&&sign[i+]){ //当两个相邻层都有点才建边
addEdge(i+n,i+n+,c);
addEdge(i+n+,i+n,c);
}
}
for(int i=;i<=n;i++){ //虚拟点到同一层的点建边
addEdge(layer[i]+n,i,);
if(layer[i]>) //点和相邻层的虚拟点建边
addEdge(i,layer[i]+n-,c);
if(layer[i]<n)
addEdge(i,layer[i]+n+,c);
} for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
spfa();
if(dis[n]<INF)
printf("Case #%d: %d\n",++cas,dis[n]);
else
printf("Case #%d: -1\n",++cas);
}
return ;
}
HDU 4725 The Shortest Path in Nya Graph(spfa+虚拟点建图)的更多相关文章
- hdu 4725 The Shortest Path in Nya Graph (最短路+建图)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- Hdu 4725 The Shortest Path in Nya Graph (spfa)
题目链接: Hdu 4725 The Shortest Path in Nya Graph 题目描述: 有n个点,m条边,每经过路i需要wi元.并且每一个点都有自己所在的层.一个点都乡里的层需要花费c ...
- HDU 4725 The Shortest Path in Nya Graph(最短路建边)题解
题意:给你n个点,m条无向边,每个点都属于一个层,相邻层的任意点都能花费C到另一层任意点,问你1到n最小路径 思路:没理解题意,以为每一层一个点,题目给的是第i个点的层数编号.这道题的难点在于建边,如 ...
- HDU 4725 The Shortest Path in Nya Graph [构造 + 最短路]
HDU - 4725 The Shortest Path in Nya Graph http://acm.hdu.edu.cn/showproblem.php?pid=4725 This is a v ...
- HDU 4725 The Shortest Path in Nya Graph
he Shortest Path in Nya Graph Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged o ...
- HDU 4725 The Shortest Path in Nya Graph(构图)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 4725 The Shortest Path in Nya Graph (最短路)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- (中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...
- HDU 4725 The Shortest Path in Nya Graph(最短路径)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)
Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...
- HDU 4725 The Shortest Path in Nya Graph (最短路 )
This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just ...
随机推荐
- SQL注入9种绕过WAF方法
SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...
- Zend Hash table 详解--转
原文地址:http://www.phppan.com/2009/12/zend-hashtable/ 在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量.变 ...
- Codeforces 576C. Points on Plane(构造)
将点先按x轴排序,把矩形竖着划分成$10^3$个块,每个块内点按y轴排序,然后蛇形走位上去. 这样一个点到下一个点的横坐标最多跨越$10^3$,一共$10^6$个点,总共$10^9$,一个块内最多走$ ...
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- 使用pt-ioprofile监控数据库io文件读写情况
我们在做IO密集型的应用程序的时候,比如MySQL数据库,通常系统的表现取决于workload的类型. 比如我们要调优,我们就必须非常清楚的知道数据的访问规律,收集到足够的数据,用来做调优的依据. 有 ...
- 洛谷P1199 三国游戏
题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...
- Windows10实用技巧-固定快捷方式到磁贴菜单方式
快捷方式固定到磁贴 Win10的开始菜单中的磁贴功能比较不错,可以在不清理桌面上其他软件的情况下直接唤醒需要的应用. 但是比较麻烦的是一些应用或快捷方式并不能直接固定到上面. 后来发现所有Windo ...
- UVA-10375 数学
UVA-10375 题意 : 输入p,q,r,s,求C(p,q)/C(r,s). p,q,r,s<=10000:结果不超过1e8 代码: //显然不能直接计算,考虑每个数都可以由若干个素数乘积得 ...
- duilib 增加gif控件(基于gdi+,可控制播放暂停,自动设置大小)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42502081 因为项目需要我需要给duilib增加一个gif控件,目前已 ...
- Java集合框架(set)
set继承自collection接口,其子类和子接口如下: set的共同特性:不能添加相同的元素,通常无法记住元素添加的顺序 1.HashSet类 判断两元素相同的标准:1.equals方法返回tru ...