【问题描述】
平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点之间通路,通路的距离为两点间的直线距离。现在的任务是找出从一个点到另一个点之间的最短路径。
【输入格式】
第一行为整数n。
第二行到第n+1行,每行两个整数x和y,描述一个点的坐标。
第n+2行为一个整数m,表示图中连线的个数。
此后的m行,由两个整数i和j组成,表示第i个点和第j个点之间有连线。
最后一行为两个整数s和t,分别表示源点和目标点。
【输出格式】
仅一行,一个实数(保留两位小数),表示s到t的最短路径长度。
【样例输入】
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
【样例输出】
3.41
【问题解答】
1.Floyed-Warshall(弗洛伊德)算法
#include
using namespace std;
int n,i,j,k,x,y,m,s,e,a[101][3];
double f[101][101];
int main(){
cin>>n;
for(i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];
cin>>m;
memset(f,0x7f,sizeof(f));
for(i=1;i<=m;i++){
cin>>x>>y;
f[y][x]=f[x][y]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
}
cin>>s>>e;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]
2.Dijkstra(迪杰斯特拉)算法
#include
using namespace std;
int n,i,j,k,x,y,m,s,e,a[101][3];
double f[101][101],c[101],minn,maxn=1e30;
bool b[101][101];
int main(){
cin>>n;
for(i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)f[i][j]=maxn;
}
cin>>m;
for(i=1;i<=m;i++){
cin>>x>>y;
f[x][y]=f[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
}
cin>>s>>e;
memset(b,false,sizeof(b));
b[s]=true;
c[s]=0;
for(i=1;i<=n;i++)c[i]=f[s][i];
for(i=1;i<=n;i++){
minn=maxn;
k=0;
for(j=1;j<=n;j++){
if((!b[j])&&(c[j]
3.Bellman-Ford(福特)算法
#include
using namespace std;
int main(){
int n,k,x,y,m,f[1001][3],s,t;
double a[101][3],dis[1001],w[1001],minn;
bool b[101];
cin>>n;
for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i][1],&a[i][2]);
cin>>m;
for(int i=1;i<=n;i++){
dis[i]=0x7fffffff/3;
f[i][1]=f[i][2]=0x7fffffff/3;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
f[i][1]=x;
f[i][2]=y;
w[i]=sqrt(pow(a[x][1]-a[y][1],2)+pow(a[x][2]-a[y][2],2));
}
cin>>s>>t;
dis[s]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(dis[f[j][1]]+w[j]
本文内容为小编自己汇总,内容可能会有错误或疏漏,感谢大家的提议!
记得点赞和关注哦~