您的位置:首页 > 其它

更加深入的了解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;
}
}






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: