更加深入的了解Floyd
2011-11-26 10:46
190 查看
下面来看一道简单的但是有点意思
的最短路径的问题。本次用的解法
是Floyd.
题目:http://acm.swust.edu.cn/oj/problem/0819/
在使用Floyd的时候有三点需要注意:
一:map[][]数组的初始化
这个是十分的重要的,不然无法Floyd。具体点就是,map[i][i]=0;map[i][j]=INF;
二、输入时候的选择性
只有做到这一步,才能保证是最短的,不然不行。具体点就是,if(map[u][v]>w)map[u][v]=map[v][u]=w;
这个主要用在题目中没有说明是否会多次输入同一条边的时候。
三、只有一个结点的情况
毫无疑问输出结果就是0了,但是一定要把这个给特判一下。不然Wrong。
好了,不说了,具体的还是看代码要好点。
ViewCode
#include"iostream"
usingnamespacestd;
#defineeMax505
#definenMax105
#defineINF99999999
structedge
{
intfir,sec;
}e[eMax];
intmap[nMax][nMax];
intn,m;
voidFloyd()
{
for(intk=1;k<=n;k++)
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
intmain()
{
intu,v,w,k;
while(cin>>n>>m)
{
k=0;
for(inti=1;i<=n;i++){//map数组的初始化
for(intj=1;j<=n;j++){
if(i==j)map[i][j]=0;
elsemap[i][j]=INF;
}
}
for(inti=0;i<m;i++){//输入时的处理
cin>>u>>v>>w;
if(map[u][v]>w){
map[u][v]=map[v][u]=w;
e[k].fir=u;e[k++].sec=v;
}
}
Floyd();
intMin=INF;
for(inti=0;i<k;i++)
{
u=e[i].fir;v=e[i].sec;
Min=min(Min,map[1][u]+map[v]
);
Min=min(Min,map[1][v]+map[u]
);
}
if(n==1)cout<<"0"<<endl;
elseif(Min<INF)cout<<Min<<endl;
elsecout<<"-1"<<endl;
}
}
相关文章推荐
- Android事件传递机制(更加深入的了解事件的触发过程)
- 看了一晚上的视频,对printf有了更加深入的了解
- Android事件传递机制(更加深入的了解事件的触发过程)
- Android事件传递机制(更加深入的了解事件的触发过程)
- Android事件传递机制(更加深入的了解事件的触发过程)
- 更加深入的了解SPFA
- 如何更加深入的了解网站用户行为
- 断路器-Hystrix的深入了解
- 深入了解android平台的jni---编译ffmpeg源码
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- 深入了解硬盘分区表与逻辑锁
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
- 深入了解超线程、双核CPU、双CPU与单CPU的区别
- 深入了解Linux设备模型
- javascript深入了解(面向对象)
- 深入了解 CSS3 新特性
- 计算机培训深入了解电脑病毒的弱点
- 转载: 深入了解Oracle SCN (1)
- 深入了解CloudStack中的网络设计
- Android视图绘制流程完全解析,带你一步步深入了解View(二)