#include<bits/stdc++.h>
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int d[N][N];
int n,m,Q;
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][j],d[i][k]+d[k][j]);
}
}
}
}
int main(){
cin>>n>>m>>Q;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) d[i][j]=0;
else d[i][j]=INF;
}
}
while(m--){
int a,b,c;
cin>>a>>b>>c;
d[a][b]=min(d[a][b],c);
}
floyd();
while(Q--){
int a,b;
cin>>a>>b;
if(d[a][b]>INF/2) puts("impossible");
else cout<<d[a][b]<<endl;
}
return 0;
}
为啥测试样式还会有 4 4 5。我惊了
题干说明:图中可能存在重边和自环
d[a][b]=min(d[a][b],c)避免了重边和自环,只会保存最小的距离
例如a到a的距离,只会保存0,即没有距离
a到b的距离有2和5,只保留最小值,即保留2
噢噢。看到了。蟹蟹
为什么判断d[a][b] >INF/2,就输出impossible了, INF/2是怎么来的
如果有负权边,虽然a,b不连通,但之间的距离也会因为负权边的更新小于INF,因为INF/2也是一个很大的数,所以就用>INF/2来代表不能连通
明白了,谢谢大佬!!!
不用客气
为什么if(i==j) d[i][j]=0;???
i和j相等,相当于i和j是同一个点,一个点到自己的最短距离当然为0
明白了,谢谢!
嗯嗯
那为什么我写成memset(d, 0x3f, sizeof d)提交就答案错误?
当i和j不相等的时候是0x3f,i等于j时是0
可以memset(d, 0x3f, sizeof d)后加一个for循环,使得d[i][i]=0,即让某个点到自己的距离为0
好的,明白了谢谢!
客气啦