一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】
pid=2066">http://acm.hdu.edu.cn/showproblem.php? pid=2066
由于草儿的家在一个小镇上,没有火车经过。所以她仅仅能去邻近的城市坐火车(好可怜啊~)。
接着有T行。每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数。表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
9
//Dijkstra
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int map[1010][1010];
int dis[1010];
bool used[1010];
int n;
int i,j;
void dijkstra()
{
int i,j;
memset(used,0,sizeof(used));
for(i=0;i<=1000;++i)
dis[i]=INF;
int pos;
for(i=0;i<=1000;++i)//第一次给dis赋值
{
dis[i]=map[0][i];
}
dis[0]=0;
used[0]=1;
for(i=0;i<1000;++i)//最多执行n次
{
int min=INF;
for(j=0;j<=1000;++j)
{
if(!used[j]&&dis[j]<min)
{
min=dis[j];
pos=j;
}
}
used[pos]=1;
dis[pos]=min;
for(j=0;j<=1000;++j)//把dis数组更新。也叫松弛
{
if(!used[j]&&dis[j]>map[pos][j]+dis[pos])
{
dis[j]=map[pos][j]+dis[pos];
}
}
}
}
int main()
{
int m,T;
int u,v,w;
int temp;
int a[1010],b[1010];
while(~scanf("%d%d%d",&n,&m,&T))
{
for(i=0;i<=1000;++i)
for(j=0;j<=i;++j)
map[i][j]=map[j][i]=INF;
for(i=1;i<=n;++i)
{
scanf("%d%d%d",&u,&v,&w);
if(map[u][v]>w)
map[u][v]=map[v][u]=w;
}
for(i=1;i<=m;++i)
{
scanf("%d",&temp);
map[0][temp]=0;
}
dijkstra();
int min=INF;
for(i=1;i<=T;++i)
{
scanf("%d",&temp);
if(dis[temp]<min) min=dis[temp];
}
printf("%d\n",min);
}
return 0;
}
//SPFS
#include <cstdio>
#include <cstring>
#include <queue>
#define MAXN 1100
#define MAXM 10100
#define INF 0x3f3f3f3f
using namespace std;
struct Edge
{
int u, v, w;
int next;//下一个结构体变量的下标
}edge[MAXM];
int head[MAXN];//下标为起点u,值为相应结构体下标
int vis[MAXN];//推断是否增加队列了
int num;
int low[MAXN];//存最短路径
void Add_Edge(int u, int v, int w)//加边
{
Edge E={u, v, w, head[u]};//初始化结构体
edge[num]=E;//直接赋值
head[u]=num++;
}
void SPFA(int s)
{
int i, j;
queue<int> Q;
memset(low, INF, sizeof(low));
memset(vis, 0, sizeof(vis));
vis[s] = 1;
low[s]=0;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
vis[u]=0;//出队列了,不在队列就变成0
for(j = head[u]; j != -1; j = edge[j].next)
{
int v = edge[j].v;
if(low[v] > low[u] + edge[j].w)
{
low[v] = low[u] + edge[j].w;
if(!vis[v])
{
vis[v]=1;
Q.push(v);
}
}
}
}
}
int main()
{
int u, v, w;
int S,E,M,N,s,e;
while(~scanf("%d%d%d", &N, &S,&E))
{
memset(head, -1, sizeof(head));
num=0;
for(int i=1; i <= N; ++i)
{
scanf("%d%d%d", &u, &v, &w);
Add_Edge(u, v, w);
Add_Edge(v, u, w);//无向边
}
while(S--)
{
scanf("%d",&s);
Add_Edge(0,s,0);//建万能源点
}
SPFA(0);
int min=INF;
while(E--)
{
scanf("%d",&e);
if(min>low[e]) min=low[e];
}
printf("%d\n",min);
}
return 0;
}
一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】的更多相关文章
- 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)
今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...
- 『ACM C++』HDU杭电OJ | 1418 - 抱歉 (拓扑学:多面体欧拉定理引申)
呕,大一下学期的第一周结束啦,一周过的挺快也挺多出乎意料的事情的~ 随之而来各种各样的任务也来了,嘛毕竟是大学嘛,有点上进心的人多多少少都会接到不少任务的,忙也正常啦~端正心态 开心面对就好啦~ 今天 ...
- 畅通project续HDU杭电1874【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多 ...
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- HDU Today HDU杭电2112【Dijkstra || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=2112 Problem Description 经过锦囊相助,海东集团最终度过了危机,从此.HDU的发展就一直顺风 ...
- Choose the best route HDU杭电2680【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...
- find the safest road HDU杭电1596【Dijkstra || SPFA】
pid=1596">http://acm.hdu.edu.cn/showproblem.php?pid=1596 Problem Description XX星球有非常多城市,每一个城 ...
- 升级降级(期望DP)2019 Multi-University Training Contest 7 hdu杭电多校第7场(Kejin Player)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意: 有 1~n 个等级,你现在是1级,求升到n级的花费期望.会给你n个条件(i~i+1级升级 ...
随机推荐
- 【VC编程技巧】窗口☞3.5对单文档或者多文档程序制作启动画面
(一)概要: 文章描写叙述了如何通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于 ...
- C# WebQQ协议群发机器人(二)
本文出处http://blog.csdn.net/zhujunxxxxx/ 如需转载请注明出处! 接着上一篇http://blog.csdn.net/zhujunxxxxx/article/detai ...
- python中类的定义、实例化、封装以及私有变量/方法
1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...
- Regexp-Utils:基本
ylbtech-Regexp-Utils:基本 1.返回顶部 1. /** * 管理 */ var utils = { hostUrl: "http://localhost:8023&quo ...
- canvas绘制爱心
需求:绘制爱心图像轨迹. 实现:直接贴代码吧! 预览地址:https://codepen.io/wzc570738205/pen/dqqBpj <!DOCTYPE> <html> ...
- Python笔记(四)
# -*- coding:utf-8 -*- # 控制语句 # if...else... print "********************1********************** ...
- Java 系列之spring学习--springmvc搭建(四)
一.建立java web 项目 二.添加jar包 spring jar包下载地址http://repo.spring.io/release/org/springframework/spring/ 2. ...
- Centos上JDK的安装搭建
一.下载 yum search java|grep jdk //查找所有jdk版本 二.选择安装1.8 yum install java-1.8.0-openjdk-src-debug.x86_64 ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...
- 学Arduino 需要做哪些准备?(引自"知乎用户:郑兴芳,DhP"的回答)
本人非电子专业,使用Arduino完全出于兴趣,目前主要用于实验过程中的自动化操作. 一.基础准备主要是看一些入门介绍的电子文档,如Arduino_Basic.PDF.ArduinoL2.PDF .& ...