http://code.qingtengbc.com/problem/10096
简单的fioyd算法问题,数据不大
#include<bits/stdc++.h>
using namespace std;
int n,m;
double dis[110][100];//记录第i到j的距离
int x[110];
int y[110];
void floyd()//floyd最短路算法,优点:代码简洁,缺点:时间复杂度高n的三次方
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&i!=k&&k!=j)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//挨着遍历,三个for就能把周围能联通的点
}
}
}
}
}
int main()
{
//memset(dis,0x3f,sizeof dis);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];//输入坐标
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=1e12;//初始化,不可能到达的状态
}
}
cin>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;//输入链接边
double len=sqrt(pow(x[u]-x[v],2)+pow(y[u]-y[v],2));//计算两点之间的距离
dis[u][v]=len;//n的数据不大,空间不会爆,故可用邻接矩阵
dis[v][u]=len;
}
int s,e;
cin>>s>>e;//输入查找点4
floyd();
printf("%.2lf",dis[s][e]);
cout<<endl;
return 0;
}