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. swift和OC中frame的小差异

    //1.0 OC中 CGRect .CGPoint.CGSize 的结构如下: struct CGRect { CGPoint origin; CGSize size; }; struct CGPoi ...

  2. 生成一个文件夹中的所有文件的txt列表

    1.windows操作系统中 1.用管理员运行打开dos界面: 2.用cd转到相应的文件夹中: 3.用dir /b /on >list.txt来生成文件列表的txt. 2.Mac系统中 1.打开 ...

  3. java-学习6

    public class arryTest4 { //对整型数组按照由小到大的顺序进行排序 public static void main(String[] args) { int score[]= ...

  4. MySQL动态开启general_log

    mysql下用以下命令查看general_log的开启状态. show global variables like '%general%'; 调整general_log位置,linux下一般是/tmp ...

  5. Socket通讯-Netty框架实现Java通讯

    Netty简介 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...

  6. 一个查询指定错误记录数据表错误记录条数的shell脚本

    #!/bin/bash #author:skycheng #parameters db_user=dbuser db_pass=dbpass db_host=xxx.xxx.xxx.xxx datab ...

  7. node-rsa

    [node-rsa] 引用 var NodeRSA = require('node-rsa') 生成一个私钥长度为512的key(同时生成公钥) var key = new NodeRSA({b: 5 ...

  8. JIT物料在途未清PO作为供给

    以下是本应在TEMP中处理,目前是写到FP_CHECK_SAP_DATA中 ----JIT物料在途未清PO作为供给 add by landor on 20180809 INSERT INTO SAP_ ...

  9. 如何从Windows中删除Node.js

    如何从Windows中删除Node.js: 1.从卸载程序卸载程序和功能. 2.重新启动(或者您可能会从任务管理器中杀死所有与节点相关的进程). 3.寻找这些文件夹并删除它们(及其内容)(如果还有). ...

  10. MS17-010漏洞检测

    1.扫描脚本的下载和加载 由于Metasploit还没有更新MS17-010检测的模块,所以要去exploit-db下载,并在MSF中加载. cd /usr/share/metasploit-fram ...