【模板】Floyd
一般\(floyd\)
#include<bits/stdc++.h>
using namespace std;
const int z = 128;
int m, n, dis[z][z], pre[z][z], start, end;
void print(int e) {
if(!pre[start][e]) return;
print(pre[start][e]);
printf(" > %d",e);
}
int main() {
memset(dis,50,sizeof(dis));
scanf("%d %d",&n,&m);
for(int i = 1;i <= m;++i) {
int from, to, weight;
scanf("%d %d %d",&from,&to,&weight);
dis[from][to] = dis[to][from] = weight;
pre[from][to] = from;
pre[to][from] = to;
}
for(int k = 1;k <= n;++k)
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
if(i != j&&i != k&&j != k)
if(dis[i][j] > dis[i][k]+dis[k][j]) {
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
pre[i][j] = pre[k][j];
}
while(1) {
int a;
printf("ask?\n");
scanf("%d",&a);
if(!a) break;
scanf("%d %d",&start,&end);
printf("dis = %d;\n",dis[start][end]);
printf("path : %d",start);
print(end);
printf("\n");
}
return 0;
}
\(floyd\)判最小环
#include<bits/stdc++.h>
using namespace std;
const int z = 128;
int loop[z][z], dis[z][z], m, n, ans = 65536;
int main() {
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;++i) for(int j = 1;j <= n;++j) if(i != j) dis[i][j] = 65535;
for(int i = 1;i <= m;++i) {
int a, b, w;
scanf("%d %d %d",&a,&b,&w);
dis[a][b] = dis[b][a] = w;
//dis[a][b] = w;
}
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
loop[i][j] = dis[i][j];
for(int k = 1;k <= n;++k) {
for(int i = 1;i < k;++i)
for(int j = i+1;j < k;++j) {
ans = min(ans,dis[i][j]+loop[i][k]+loop[k][j]);
//ans = min(ans,dis[i][j]+loop[j][k]+loop[k][i]);
}
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]);
}
printf("%d",ans);
}
注:被注释掉的是有向最小环的写法。