![](https://i-blog.csdnimg.cn/blog_migrate/552d9f88ced1956b48c28ea39fa78f82.png)
![](https://i-blog.csdnimg.cn/blog_migrate/106718feadc368623362a72dff7c7fbb.png)
代码里面有详细注释说明哦
![](https://i-blog.csdnimg.cn/blog_migrate/b82881e9a196076106790f17aab44555.png)
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
long long dis[510][510];//代表i到j的最短路程 ,要 开 long long ,直接拿下
void Floyd(int n)//算法,求出从每个点出发到每个点的最短路程(Floyd) //***********************************
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//转移方程(dp) ,可能是i直接一步到了j,也可能是i结果若干步,再到j(k代表若干步试探)
//不一定就是i可以到k,k也不一定到j,所以我们进行对k的枚举,(先不考虑不能从i到j的情况,下面会解决这个情况),肯定会找到
//i,j也跟着枚举(就是dp思想)
}
}
int main()
{
cin>>n>>m>>q;
memset(dis,0x3f,sizeof(dis));//把每个点之间的距离先初始化为无穷大,方便接应下面的min算法*********
for(int i=1;i<=m;i++)//输入
{
int u,v,w;
cin>>u>>v>>w;
dis[u][v]=dis[v][u]=min(dis[u][v],(long long)w);//可能出现i->j距离为2,但是j->i为3,(因为题目说景点之间有m条,没说不能反过来)**************
//可能m条中有两条是i->j的,(有权图*****类似双向图) 可能i->j距离为2,但是j->i为3,
//如果少了 min(dis[u][v],(long long)w);min会错掉好几个测试点******************
}
for(int i=1;i<=n;i++) dis[i][i]=0;//自己到自己的距离可能为零
Floyd(n);//关键 ,求出从每个点出发到每个点的最短路程(Floyd),注意是每个点,有点像dp
while(q--)//q次询问
{
int st,ed;
cin>>st>>ed;
if(dis[st][ed]>1e15) cout<<"-1"<<endl;//i不能到j的情况
else cout<<dis[st][ed]<<endl;
}
return 0;
}
okk~