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] ...
随机推荐
- 请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别
请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别啊 我先是编译了一个.so 然后在此次编译的使用调用,请问用LOCAL_SHARED_LIBRARIES和 ...
- Android NDK学习记录(一)
一.NDK环境在Mac中部署 1.准备eclipse,android sdk安装包,android ndk安装包(http://dl.google.com/android/ndk/android-nd ...
- 【Linux】通过传入变量进行数学运算
一个简单的sum求和 #! /bin/bash ## For get the sum of tow numbers ## Writen by Qinys ## Date:2018-06-26 a=1 ...
- jQuery Growl 插件(消息提醒)
jQuery Growl 插件(消息提醒) 允许您很容易地在一个覆盖层显示反馈消息.消息会在一段时间后自动消失,不需要单击"确定"按钮等.用户也可以通过移动鼠标或点击关闭按钮加快隐 ...
- python selenium ---键盘事件
转自:http://www.cnblogs.com/fnng/p/3258946.html 本节重点: l 键盘按键用法 l 键盘组合键用法 l send_keys() 输入中文运行报错问题 键盘按键 ...
- word2vector 理解入门
1.什么是word2vector? 我们先来看一个问题,假如有一个句子 " the dog bark at the mailman". 假如用向量来表示每个单词,我们最先想到的是用 ...
- Maven实战(一)搭建Nexus伺服器
在搭建伺服器之前我们先要说明一下为什么要搭建伺服器以及伺服器的作用是什么.在进行分布式开发中maven工具的使用可以极大的提高我们管理项目颗粒的效率,既然是管理颗粒那总得有地方存放才行,而伺服器扮演的 ...
- 点滴积累【JS】---JS小功能(JS实现多物体缓冲运动)
效果: 思路: 利用setInterval计时器进行运动,offsetWidth实现宽度的变动,在用onmouseover将终点和所选中的DIV放入参数再进行缓冲运动. 代码: <head ru ...
- 使用jquery dialog
网页开发中,弹窗还是很有必要的.本人比较喜欢jquery ui的dialog. 但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义…… ...
- C#画图消除锯齿
using (Graphics g = this.CreateGraphics()) { g.SmoothingMode = SmoothingMode.HighQuality; //图片柔顺模式选择 ...