AcWing 858. Prim算法求最小生成树
原题链接
简单
作者:
当下LYC
,
2024-01-23 16:37:35
,
所有人可见
,
阅读 19
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210,INF = 1e9;
int n,m,Q;
int d[N][N];
void Floyd()
{
for(int k = 1 ;k <= n ; k++)
for(int i = 1; i <=n ; i++)
for(int j = 1; j <= n ; j++)
d[i][j] = min(d[i][k] + d[k][j] , d[i][j]);
}
int main()
{
scanf("%d%d%d",&n,&m,&Q);
//初始化
for(int i = 1; i <= n ; i++)
for(int j = 1 ; j<= n ; j++)
if(i == j) d[i][j] = 0;//数组表示:从第i个点到第j个点的距离
else d[i][j] = INF;
//初次优化最短路
while(m--)
{
int a,b,c; scanf("%d%d%d",&a,&b,&c);
d[a][b] = min(d[a][b] ,c);
}
//二次算法优化最短路
Floyd();
while(Q --)
{
int a,b;
scanf("%d%d",&a,&b);
int t = d[a][b];
if(t > INF / 2) puts("impossible");//跟之前的算法原因相同:两个无法被访问到的距离为无穷的边收到了负权的影响变小
else printf("%d\n",t);
}
return 0;
}