hdu2066 一个人的旅行 最短路
单源最短路裸题
#include<stdio.h>
#include<string.h>
#define min(a,b) (a)<(b)?a:b
#define INF 100001
int T,S,D,dist[],v[][],m,l[],r[]; void DIJKSTRA(int x){
int i,j,mi,minj;
bool visit[]={};
for(i=;i<=m;i++)dist[i]=v[x][i];
visit[x]=;
for(i=;i<m;i++){
mi=INF;
for(j=;j<=m;j++){
if(!visit[j]&&dist[j]<mi){
mi=dist[j];
minj=j;
}
}
if(mi==INF) return;
visit[minj]=;
for(j=;j<=m;j++){
if(!visit[j]&&dist[j]>dist[minj]+v[minj][j]){
dist[j]=dist[minj]+v[minj][j];
}
}
}
} int main(){
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
int q,tm=0xFFFFFFF,i,j;
for(i=;i<;i++){
for(j=;j<;j++){
v[i][j]=INF;
}
}
m=-;
for(q=;q<=T;q++){
int a,b,va;
scanf("%d%d%d",&a,&b,&va);
v[a][b]=v[b][a]=min(va,v[a][b]);
if(a>m)m=a;
if(b>m)m=b;
}
for(q=;q<=S;q++)scanf("%d",&l[q]);
for(q=;q<=D;q++)scanf("%d",&r[q]);
for(i=;i<=S;i++){
DIJKSTRA(l[i]);
for(j=;j<=D;j++){
if(dist[r[j]]<tm)tm=dist[r[j]];
}
}
printf("%d\n",tm);
}
return ;
}
以前不太懂,头硬直接跑了s遍没有优化的dijkstra,每遍循环看下d个点取最优也能过,复杂度应该是O( s * (n^2) ),那么大概s不是很大,所以据说O(n^3)的floyd过不了(据说,我也不清楚),但是这样都能过。
不过现在重新看,这个题对于初学者来说应该还是很有亮点的。
它的s个起点、d个终点可以为其建立一个源点一个汇点,这样源点有条边到每个可行起点,而每个可行终点有条边到汇点,只需要从源点到汇点跑一次单源最短路,无需遍历终点直接输出汇点的dis就是答案了。
这种题当时要是没有水过去,而是被卡了找找网上的分析,应该很有帮助吧。
#include<stdio.h> //基本需要的头文件
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f; const int maxn=1e3+;
const int maxm=1e5+; struct pii{
int dis;
int s;
bool operator < (const pii x)const{
return dis > x.dis;
}
pii(int a,int b):dis(a),s(b){};
};
int head[maxn],nxt[maxm<<],val[maxm<<],point[maxm<<],size;
int dis[maxn]; void init(){
memset(head,-,sizeof(head));
size=;
} void add(int a,int b,int v){
point[size]=b;
val[size]=v;
nxt[size]=head[a];
head[a]=size++;
} void dij(int s,int t){ //传入出发点和到达点
int i;
priority_queue<pii>q;
q.push(pii(,s));
memset(dis,0x3f,sizeof(dis));
dis[s]=;
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.dis>dis[u.s])continue;
for(i=head[u.s];~i;i=nxt[i]){
int j=point[i];
if(dis[j]>u.dis+val[i]){
dis[j]=u.dis+val[i];
q.push(pii(dis[j],j));
}
}
}
printf("%d\n",dis[t]); //或去掉在主函数中输出或操作
} int main(){
int t,s,d;
while(scanf("%d%d%d",&t,&s,&d)!=EOF){
init();
while(t--){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
add(b,a,v);
}
for(int i = ; i <= s ; ++ i){
int a;
scanf("%d",&a);
add(,a,);
}
for(int i = ; i <= d ; ++ i){
int a;
scanf("%d",&a);
add(a,,);
}
dij(,);
}
return ;
}
hdu2066 一个人的旅行 最短路的更多相关文章
- HDU2066 一个人的旅行 最短路基础
新手熟悉一下迪杰斯特拉... 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu-2066 一个人的旅行(最短路spfa)
题目链接: 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- hdu2066一个人的旅行(dijkstra)
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
- HDU2066一个人的旅行/最短路问题
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu2066一个人的旅行(floyd优化)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU2066一个人的旅行---(多起点多终点最短路径)
http://acm.hdu.edu.cn/showproblem.php?pid=2066 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memo ...
- hdu2066一个人的旅行(disjkstra)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu2066一个人的旅行(多源点多汇点的最短路径问题)
/* 思路:多源点,多会点的最短路径! 将最小号-1的节点但最源点,将最大号+1的点当作汇点! 将问题转变成从一个源点到一个汇点的最短路径的问题! 开始忘记初始化vector了,哇了好多次....坑爹 ...
- HDU2066一个人的旅行(dijkstra)
一开始拿到这个题感觉floyd可能会超,还是写了写,果然1WA+1TLE,之后觉得用dijkstra试试看看S和D会不会比较小,还是1WA+1TLE,最后还是借鉴了别人的做法. 把他的家作为起点,与他 ...
随机推荐
- C#快速生成数据数组
需求:生成一个数组,数组里面的值为1-100实现方式:拿到这个需求很多朋友可能会想到一个快速实现的方式如下: ]; ;i<=;i++){ arr[i]=i; } 但是C#提供了一个快速生成的方式 ...
- spring boot: spring-data-jpa (Repository/CrudRepository) 数据库操作, @Entity实体类持久化
SpringBoot实现的JPA封装了JPA的特性, Repository是封装了jpa的特性(我是这么理解的) 1在pom.xml引入mysql, spring-data-jpa依赖 2.在src/ ...
- English trip -- VC(情景课)10 A Get ready 预备课
Words dance 跳舞 exercise 运动:锻炼 fish 鱼 play basketball 打篮球 play cards 玩牌 swim 游泳 decorations 装饰品 ...
- 用Omniauth来Login with Facebook(Go-rails课程)
https://gorails.com/episodes/login-with-facebook?autoplay=1 大概看了一遍,留了视频的截图. https://gorails.com/epis ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- Anton and School - 2 CodeForces - 785D (组合计数,括号匹配)
大意: 给定括号字符串, 求多少个子序列是RSGS. RSGS定义如下: It is not empty (that is n ≠ 0). The length of the sequence is ...
- gradle 编译 No such property: sonatypeUsername错误解决
No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...
- 『TensorFlow』通过代码理解gan网络_中
『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上 上篇是一个尝试生成minist手写体数据的简单GAN网络,之前有介绍过,图片维度是28*28*1,生成器的上采样使 ...
- Linux系统中切换用户身份su与sudo的用法与实例
日常操作中为了避免一些误操作,更加安全地管理系统,通常使用的用户身份都为普通用户,而非root.当需要执行一些管理员命令操作时,再切换成root用户身份去执行. 普通用户切换到root用户的方式有:s ...
- 24.2 网络编程基础——System.Net 命名空间
使用C#进行网络编程时,通常要用到: System. Net 命名空间. System. Net. Sockets 命名空间. System. Net. Mail 命名空间. 24.2.1 Sy ...