hdu3665-Seaside(SPFA,dijkstra,floyd)
Seaside
from the town numbered ’0’, but not all towns connect to each other by roads directly, and there is no ring in this city. One day, XiaoY want to go to the seaside, he asks you to help him find out the shortest way.
are Mi roads beginning with the i-th town. Pi indicates whether the i-th town is near to the sea, Pi=0 means No, Pi=1 means Yes. In next Mi lines, each line contains two integers SMi and LMi, which means that the distance between the
i-th town and the SMi town is LMi.
5
1 0
1 1
2 0
2 3
3 1
1 1
4 100
0 1
0 1
2
最短路径。话不多说,SPFA,dijkstra,floyd各贡献一枚!
dijkstra:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int map[15][15],dis[1000],vis[1000],target[15];
int N;
void dijkstra()
{
memset(dis,INF,sizeof(dis));
int i,j;
for(i=0;i<N;i++)
{
dis[i]=map[0][i];
vis[i]=0;
}
dis[0]=0;
vis[0]=1;
for(i=0;i<N;i++)
{
int mi=INF,mark=-1;
for(j=0;j<N;j++)
{
if(!vis[j]&&dis[j]<mi)
{
mi=dis[j];
mark=j;
}
}
if(mark==-1)
break;
vis[mark]=1;
for(j=0;j<N;j++)
{
if(!vis[j]&&dis[j]>dis[mark]+map[mark][j])
dis[j]=dis[mark]+map[mark][j];
}
}
}
int main()
{
int n,a,b,d,i,j,m;
while(scanf("%d",&N)!=EOF)
{
int t=0;
memset(map,INF,sizeof(map));
for(i=0;i<N;i++)
{
scanf("%d%d",&m,&n);
if(n)
target[t++]=i;
for(j=0;j<m;j++)
{
scanf("%d%d",&a,&b);
map[i][a]=map[a][i]=b;
}
}
dijkstra();
int s[15];
for(i=0;i<t;i++)
s[i]=dis[target[i]];
sort(s,s+t);
printf("%d\n",s[0]);
}
return 0;
}
floyd:
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int target[1000],map[15][15];
int N;
void floyd()
{
int i,k,j;
for(k=0;k<N;k++)
{
for(i=0;i<N;i++)
{
if(map[k][i]==INF)
continue;
for(j=0;j<N;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int main()
{
int n,i,j,a,d,m;
while(scanf("%d",&N)!=EOF)
{
int t=0;
memset(map,INF,sizeof(map));
for(i=0;i<N;i++)
{
scanf("%d%d",&m,&n);
if(n)
target[t++]=i;
for(j=0;j<m;j++)
{
scanf("%d%d",&a,&d);
map[i][a]=map[a][i]=d;
}
}
floyd();
int q=INF;
for(i=0;i<t;i++)
q=q>map[0][target[i]]?map[0][target[i]]:q;
printf("%d\n",q);
}
return 0;
}
SPFA:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int head[20],target[15],vis[20],dis[20];
int N,t,w;
struct node
{
int from,to,weight,next;
}s[1000];
void spfa()
{
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
queue<int> q;
q.push(0);
vis[0]=1;
dis[0]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
dis[0]=0;
for(int k=head[u];k!=-1;k=s[k].next)
{
int v=s[k].to;
if(dis[v]>dis[u]+s[k].weight)
{
dis[v]=dis[u]+s[k].weight;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
} }
int qw[1000];
for(int i=0;i<t;i++)
qw[i]=dis[target[i]];
sort(qw,qw+t);
printf("%d\n",qw[0]);
}
int main()
{
int n,a,b,d,i,j,m;
while(scanf("%d",&N)!=EOF)
{
t=0,w=0;
memset(head,-1,sizeof(head));
for(i=0;i<N;i++)
{
scanf("%d%d",&m,&n);
if(n)
target[t++]=i;
for(j=0;j<m;j++)
{
scanf("%d%d",&a,&b);
s[w].from=i;
s[w].to=a;
s[w].weight=b;
s[w].next=head[i];
head[i]=w++;
s[w].from=a;
s[w].to=i;
s[w].weight=b;
s[w].next=head[a];
head[a]=w++;
}
}
spfa();
}
return 0;
}
三种方法。各有利弊,可是floyd无疑是最简单的,三重for循环即可了。只是时间复杂度挺高的,easy超时。但这个题,0ms没问题!
有什么问题希望大家指出。谢谢!
hdu3665-Seaside(SPFA,dijkstra,floyd)的更多相关文章
- ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- HDU 1874 畅通工程续 SPFA || dijkstra||floyd
http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...
- HDU 1874 SPFA/Dijkstra/Floyd
这题作为模板题,解法好多... 最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习. 暂时只有SPFA和Dijkstra的 SPFA (邻接表版.也可以写成临接矩阵存图,但题目可能给出平行边的,所以 ...
- poj1847 Tram(Dijkstra || Floyd || SPFA)
题目链接 http://poj.org/problem?id=1847 题意 有n个车站,编号1~n,每个车站有k个出口,车站的出口默认是k个出口中的第一个,如果不想从默认出口出站,则需要手动选择出站 ...
- Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
参考 有空再更新下用c++, 下面用的Java Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV) BellmanFord:适用于权值有负值的图的单源最短路径 ...
- 最短路问题(Bellman/Dijkstra/Floyd)
最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...
- POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)
Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37662 Accepted ...
- 最短路径:Dijkstra & Floyd 算法图解,c++描述
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- dijkstra,SPFA,Floyd求最短路
Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...
随机推荐
- Vim快捷键整理
Vim主要分为两种模式一种是Insert模式,该模式下可以像其它文本编辑器一样正常输入字符:另一种是Normal模式,该模式下Vim监听用户的按键可以对文本进行快速修改. 想要从Insert模式切换到 ...
- C# 利用反射拷贝类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Oracle中查询某字段不为空或者为空的SQL语句怎么写
比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...
- Eclipse项目上红叉
整个项目可以编译通过并且运行都没问题,但是项目上有个红叉,这个问题一般是有两个原因: 1.查看项目是不是有的引用包报错 解决办法:在项目的build path 中删除不可用引用或者修正 2.项目的编译 ...
- Linux修改时间的方法
http://www.blogjava.net/itvincent/archive/2007/08/03/134242.html修改linux的时间可以使用date指令 在命令行输入: date 显示 ...
- PHP 常用函数回顾
array_change_key_case — 返回字符串键名全为小写或大写的数组array_chunk — 将一个数组分割成多个array_combine — 创建一个数组,用一个数组的值作为其键名 ...
- C语言printf格式化输出修饰符详解
转换说明 输出 %a,%A 浮点数.十六进制数和p-计数法(C99) %c 一个字符 %d 有符号十进制数 %e,%E 浮点数,e计数法 %f 浮点数,十进制计数法 %g,%G 根据数值不同自动选择% ...
- bootstrap源码学习与示例:bootstrap-tab
http://www.cnblogs.com/rubylouvre/archive/2012/12/22/2829176.html bootstrap源码学习与示例 https://www.w3sc ...
- 分享分享JavaScript100例-仅供参考
最近一直在做项目,分享下以前收集的Javascript100例,仅供参考. http://files.cnblogs.com/52net/JavaScript100例.zip
- Openresty配置文件上传下载
1. 下载包安装Openresty openresty-1.13.6.1下载地址 https://openresty.org/download/openresty-1.13.6.1.tar.gz 安装 ...