【模板】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);
}

注:被注释掉的是有向最小环的写法。

@bikuhiku

posted @ 2022-06-05 20:55  bikuhiku  阅读(6)  评论(0编辑  收藏  举报