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,最后还是借鉴了别人的做法. 把他的家作为起点,与他 ...
随机推荐
- English trip -- VC(情景课)2 D Reading
Xu言: 业精于勤,荒于嬉:行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Lis ...
- Python下图片的高斯模糊化的优化
资源下载 #本文PDF版下载 Python下图片的高斯模糊化的优化(或者单击我博客园右上角的github小标,找到lab102的W6目录下即可) #本文代码下载 高斯模糊(一维)优化代码(和本文方法集 ...
- python中异常处理--raise的使用
https://www.cnblogs.com/zhangyin6985/p/7229553.html 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了rai ...
- javascript数据结构——队列
队列是一种先进先出的数据结.队列只能在队尾插入元素,在队首删除元素,这点和栈不一样.它用于存储顺序排列的数据.队列就像我们日常中的排队一样,排在最前面的第一个办理业务,新来的人只能在后面排队.队列这种 ...
- hadoop mysql install (5)
reference : http://dblab.xmu.edu.cn/blog/install-mysql/ http://wiki.ubuntu.org.cn/MySQL #install mys ...
- Gradle 完整指南(Android)
Gradle 的编译周期 在解析 Gradle 的编译过程之前我们需要理解在 Gradle 中非常重要的两个对象.Project和Task. 每个项目的编译至少有一个 Project,一个 build ...
- 传递数据后创建后台service来处理事件!
package com.lixu.service; import android.app.Service; import android.content.Intent; import android. ...
- Solr增删改查索引
一.添加索引,提交文档 1.如图,我的xml文档有predicate.object字段,这些在Solr配置文档里没有,所以xml文档提交不了 2.在F:\solr-4.10.0\example\sol ...
- 详细介绍C++STL:unordered_map
不得不提一下,hash_map未加入在C++11标准中. 在VC中编译: #include <hash_map> using namespace stdext; hash_map<i ...
- Latex的\cite后面的参考文献显示问号
今天编写Latex的参考文献,发现编译之后参考文献都是问号,很疑惑.网上搜到一个帖子,发现他的问题和我的类似,但他比我还多出一个问题,就是Bibtex按钮是灰色的无法使用. 遇到“看不到Bibtex按 ...