http://acm.hdu.edu.cn/showproblem.php?pid=2066

今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以为这是Dijkstra---我居然一直把两个算法

记的是混的,还居然一直没有被别人发现,真是个大乌龙

好了,看看这道题,赤裸裸的最短路水题,首先来个Floyd的,把城市看成点,将连通的的点赋值为给定的时间,未连通的赋值为很大,这是个无向的关系

然后就是三个循环,以一个点为媒介,把每个点遍历一遍,比较找出点连通的最小值就行,稍微优化一点点就不会超时了

code

 #include<cstdio>
#include<algorithm>
#define inf 1000000005
using namespace std;
int mp[][],q[];
void jjc()
{
int i,j;
for (i=;i<=;i++){
for (j=;j<=;j++){
if (i==j) mp[i][j]=;
else mp[i][j]=inf;
}
}
}
int min(int x,int y){
if (x<y) return x;
else return y;
}
int main()
{
int t,s,d,c,i,j,k,w,mx,a,b,mn;
while (~scanf("%d %d %d",&t,&s,&d))
{
jjc();
mx=;mn=inf;
while (t--)
{
scanf("%d %d %d",&a,&b,&c);
if (mp[a][b]>c)
mp[a][b]=mp[b][a]=c;
if (a>mx) mx=a; 没有给定范围,所以找范围
if (b>mx) mx=b;
if (a<mn) mn=a;
if (b<mn) mn=b;
}
for (k=mn;k<=mx;k++){
for (i=mn;i<=mx;i++){
if (mp[i][k]>=inf) continue; //稍微优化一点点
for (j=mn;j<=mx;j++){
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
for (i=;i<=s;i++)
scanf("%d",&q[i]);
int ans=inf;
while (d--)
{
scanf("%d",&w);
for (i=;i<=s;i++)
{
if (mp[q[i]][w]<ans)
ans=mp[q[i]][w];
}
}
printf("%d\n",ans);
}
return ;
}

然后是Dijkstra的, Floyd是把任意两点的最短距离都求了出来,而Dijkstra只是求了特定的起点与所有点之间的最短路,一般情况而言,后者要快于前者,具体用哪种根据题目而定

按照距离从小到大的顺序,找出从给定起点能够到达的下一点,每找到一个这样的点,然后更新其余点之间的距离

code

 #include<cstdio>
#define inf 100000005
using namespace std;
int map[][],vis[],dis[];
int st[],sr[];
int mn,mx;
int min(int x,int y)
{
if (x<y) return x;
else return y;
}
void jjc()
{
int i,j;
for (i=;i<=;i++){
for (j=;j<=;j++){
if (i==j) map[i][j]=;
else map[i][j]=inf;
}
}
}
void dijkstra(int x)
{
int i,pos,j,q;
for (i=mn;i<=mx;i++)
{
dis[i]=map[x][i];
vis[i]=;
}
vis[x]=;
for (i=mn;i<=mx;i++)
{
q=inf;pos=x;
for (j=mn;j<=mx;j++)
if (!vis[j]&&dis[j]<q)
{
pos=j;
q=dis[j];
}
vis[pos]=;
for (j=mn;j<=mx;j++)
dis[j]=min(dis[j],dis[pos]+map[pos][j]);
}
}
int main()
{
int t,s,d,a,b,c,i,j;
while (~scanf("%d %d %d",&t,&s,&d))
{
jjc();
mx=,mn=inf;
while (t--)
{
scanf("%d %d %d",&a,&b,&c);
if (map[a][b]>c)
map[a][b]=map[b][a]=c;
if (a>mx) mx=a;
if (b>mx) mx=b;
if (a<mn) mn=a;
if (b<mn) mn=b;
}
for (i=;i<=s;i++)
scanf("%d",&st[i]);
for (i=;i<=d;i++)
scanf("%d",&sr[i]);
int ans=inf;
for (i=;i<=s;i++)
{
dijkstra(st[i]);
for (j=;j<=d;j++)
if (dis[sr[j]]<ans)
ans=dis[sr[j]];
}
printf("%d\n",ans);
}
return ;
}

队列储存,广搜版的spfa

code

 #include<cstdio>
#include<cstring>
#include<queue>
#define inf 0x3fffffff
using namespace std;
int map[][],vis[],dis[];
int st[],sr[];
int mn,mx,s,d;
void jjc()
{
int i,j;
for (i=;i<=;i++){
for (j=;j<=;j++){
if (i==j) map[i][j]=;
else map[i][j]=inf;
}
}
}
int spfa()
{
int num,i;
memset(vis,,sizeof(vis));
for (i=mn;i<=mx;i++)
dis[i]=inf;
queue<int> q;
for (i=;i<=s;i++)
{
dis[st[i]]=;
q.push(st[i]);
}
while(!q.empty())
{
num=q.front();
q.pop();
vis[num]=;
for (i=mn;i<=mx;i++)
{
if (dis[i]>dis[num]+map[num][i])
{
dis[i]=dis[num]+map[num][i];
if (vis[i]==)
{
vis[i]=;
q.push(i);
}
}
}
}
int p=inf;
for (i=;i<=d;i++)
{
if (p>dis[sr[i]]) p=dis[sr[i]];
}
return p;
}
int main()
{
int t,a,b,c,i,j;
while (~scanf("%d %d %d",&t,&s,&d))
{
jjc();
mx=,mn=inf;
while (t--)
{
scanf("%d %d %d",&a,&b,&c);
if (map[a][b]>c)
map[a][b]=map[b][a]=c;
if (a>mx) mx=a;
if (b>mx) mx=b;
if (a<mn) mn=a;
if (b<mn) mn=b;
}
for (i=;i<=s;i++)
scanf("%d",&st[i]);
for (i=;i<=d;i++)
scanf("%d",&sr[i]);
int ans=spfa();
printf("%d\n",ans);
}
return ;
}

hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa的更多相关文章

  1. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

  2. 最短路(floyd/dijkstra/bellmanford/spaf 模板)

    floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k ...

  3. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  4. HDu 2544 最短路【dijkstra &amp; floyed &amp; SPFA 】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. hdu 2544 最短路 (dijkstra,floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) #include < ...

  6. 最短路问题 Floyd+Dijkstra+SPFA

    参考博客:https://blog.csdn.net/qq_35644234/article/details/60875818 题目来源:http://acm.hdu.edu.cn/showprobl ...

  7. HDU Today HDU杭电2112【Dijkstra || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2112 Problem Description 经过锦囊相助,海东集团最终度过了危机,从此.HDU的发展就一直顺风 ...

  8. find the safest road HDU杭电1596【Dijkstra || SPFA】

    pid=1596">http://acm.hdu.edu.cn/showproblem.php?pid=1596 Problem Description XX星球有非常多城市,每一个城 ...

  9. HDU 2544 最短路 【Dijkstra模板题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路:最短路的模板题 Dijkstra 算法是一种类似于贪心的算法,步骤如下: 1.当到一个点时, ...

随机推荐

  1. struts2 优缺点

  2. Oracle Oracle数据库 迁移到 SQL Server上

    原地址:https://blog.csdn.net/LongtengGensSupreme/article/details/81355181

  3. oracle 日志恢复数据

    1:首先查找redo,如果redo有可供恢复的信息,就那redo中的信息进行恢复,此时一般在恢复时,类似如下:SQL> recover database;Media recovery compl ...

  4. Linux 学习总结(一)

    一.Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行 ...

  5. MySQL数据类型及使用场景

    MySQL数据类型介绍 整数类型 类型名称 说明 存储需求 取值范围有符号 取值范围符号 TINYINT 很小的整数 1个字节 -128~127 0-255 SMALLINT 小的整数 2个字节 32 ...

  6. SpringCloud报错:Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

    今天启动用eureka的服务消费者时,一直出现问题. SpringCloud报错: Caused by: org.springframework.context.ApplicationContextE ...

  7. MongoDB之Limit选取Skip跳过Sort排序

    1.Limit选取 我要从Document中取出多少个 只要2条Document db.Wjs.find().limit(2) 2.Skip跳过 我要跳过多少个Document 我要跳过前两个Docu ...

  8. 137. Single Number II (Bit)

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  9. unity项目开发必备插件Asset Hunter 2(资源猎人2)

    unity必备插件 Asset Hunter 2 2.4 , 工程项目过大,垃圾太多之后的清洁利器,能识别 ,移除你用不到的资源 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop ...

  10. 二次注入的学习--Buy Flag(http://10.112.68.215:10002)

    这次有做一个二次注入的天枢CTF题目,算是完整地理解了一遍注入的知识.来,启航.   1.判断注入点     经过对题目的实践分析,知道注册时需要输入年龄大于18岁,但在登录后界面,年龄因为太大不能接 ...