啥也别说了,直入正题:有n个城市,m条路, 给你任意两个城市(n个城市中的任意2个),需要你求出这两个城市的最短路径。
输入格式:
给出第一行n和m(n<=100,m<=1000),n代表n个城市,m代表m条路,随后m行给出x,y,z三个数,x和y代表两个城市,z代表两城市之间的距离,最后一行给出要查询的两个城市
输出格式:
输出待查询两城市之间的最短路径
输入样例:
6 9
1 2 4
1 3 2
2 3 1
2 4 5
3 5 10
3 4 8
4 5 2
4 6 6
5 6 3
2 5
输出样例:
7
有两种算法可以解决这个题
一、Floyd最短路算法:
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int a[N][N]; //存放点和边的关系
int n,m,x,y,z;
int inf=999999999;
void fun()
{
for(int k=1;k<=n;k++) //把任意两点之间最近的距离找出来存放到数组a中
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
}
}
}
int main()
{
int from,to;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) //初始化点和边的关系,主对角线为0,其他点为inf
{
for(int j=1;j<=i;j++)
{
if(i==j)
{
a[i][j]=0;
}
else
{
a[i][j]=a[j][i]=inf;
}
}
}
for(int i=1;i<=m;i++) //存入两点一边
{
cin>>x>>y>>z;
a[x][y]=a[y][x]=z;
}
fun(); //把每一个点到其他点的距离都重新排到二维数组a中
scanf("%d%d",&from,&to);
cout<<a[from][to]<<endl; //输出从from点到to点的距离
return 0;
}
二、Dijkstra最短路算法:
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int j,i,e[N][N],dis[N],vis[N],x,y,z,u,v,MIN,n,m;
int from,to; // 从第几个 到第几个
int inf=999999999; //定义表示最大数
void fun()
{
for(i=1;i<=n;i++)
{
dis[i]=e[from][i]; //dis[i]存的是从from点到其他点的距离 ,现在只是初始化
}
for(i=1;i<=n;i++)
{
vis[i]=0; //初始化vis数组,让其都为0;
}
vis[from]=1; //让from点为1
for(i=1;i<=n-1;i++)
{
MIN=inf;
for(j=1;j<=n;j++) //每次都找出离from最近的点来,并且找出来的不再找
{
if(vis[j]==0&&dis[j]<MIN)
{
MIN=dis[j];
u=j;
}
}
vis[u]=1;
for(v=1;v<=n;v++) //把找出来的点的最短路径存放到dis数组中
{
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
{
dis[v]=dis[u]+e[u][v];
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) //用二维数组e来初始化顶点之间边的关系
{
for(j=1;j<=n;j++)
{
if(i==j)
{
e[i][j]=0; //主对角线为0
}
else
{
e[i][j]=e[j][i]=inf;
}
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
e[x][y]=e[y][x]=z; //当成无向图来看待
}
scanf("%d%d",&from,&to);
fun(); //把每一个点到其他点的距离都存入到dis数组中
cout<<dis[to]<<endl; //输出从from点到to点的距离
return 0;
}