hihocoder 1089
题解:最短路Floyd裸题
代码:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
int const inf = 0x7f7f7f7f;
int const N = 100 + 10;
int n,m,s,t,d[N];
int mp[N][N];
set<pii>st;
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(mp[i][j] > mp[i][k] + mp[k][j] && mp[i][k] != inf && mp[k][j] != inf)
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i == j) mp[i][j] = 0;
else mp[i][j] = inf;
}
}
st.clear();
for(int i=1;i<=m;i++){
int from,to,dist;
scanf("%d%d%d",&from,&to,&dist);
int nfrom = min(from,to), nto = max(from,to);
pii p = make_pair(nfrom,nto);
if(!st.count(p)){
st.insert(p);
mp[nfrom][nto] = dist;
}else{
if(mp[nfrom][nto] > dist)
mp[nfrom][nto] = dist;
}
}
for(set<pii>::iterator it=st.begin();it!=st.end();it++){
int from = (*it).first, to = (*it).second;
mp[to][from] = mp[from][to];
}
Floyd();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%d ",mp[i][j]);
printf("\n");
}
return 0;
}