Kruskal 25求助
  • 板块P1340 兽径管理
  • 楼主erok
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/15 12:02
  • 上次更新2023/10/27 07:28:14
查看原帖
Kruskal 25求助
655791
erok楼主2022/10/15 12:02
#include<bits/stdc++.h>
#define int long long
#define O() puts("")
#define o() printf(" ")
#define in(x) scanf("%lld",&x)
#define out(x) printf("%lld ",x)
#define OUT(x) printf("%lld\n",x)
#define fr(x,y,z) for(int x=y;x<=z;x++)
#define rf(x,y,z) for(int x=y;x>=z;x--)
const int maxn=2e2+10;
const int maxm=6e3+10;
using namespace std;
int n,m;
int cnt;
int sum;
int ans[maxm];
bool tag[maxn];
bool use[maxn];
struct Disjoint_set_data_structure {
	int fa[maxn];
	void init(int Max) {
		fr(i,1,Max) fa[i]=i;
	}
	int find(int x) {
		return x==fa[x] ? x : fa[x]=find(fa[x]);
	}
	void merge(int x,int y) {
		if(find(x)^find(y)) fa[find(y)]=find(x);
	}
} ds;
struct node {
	int u;
	int v;
	int w;
	int id;
	friend bool operator <(node a,node b) {
		return a.w<b.w;
	}
} e[maxm];
int Kruskal() {
	ds.init(n);
	sum=cnt=0;
	fr(i,1,m) {
		if(tag[e[i].id]) continue;
		if(ds.find(e[i].u)^ds.find(e[i].v)) {
			cnt++;
			sum+=e[i].w;
			use[e[i].id]=true;
			ds.merge(e[i].u,e[i].v);
		}
		if(cnt==n-1) {
			return sum;
		}
	}
	return -1ll;
}
void init() {
	in(n),in(m);
	fr(i,1,m) ans[i]=-1ll;
	fr(i,1,m) in(e[i].u),in(e[i].v),in(e[i].w),e[i].id=i;
	sort(e+1,e+1+m);
}
void answer() {
	ans[m]=Kruskal();
	rf(i,m-1,1) {
		if(i<n-1) break;
		tag[i+1]=true;
		if(use[i+1]) ans[i]=Kruskal();
		else ans[i]=ans[i+1];
		if(ans[i]==-1) break;
	}
}
void print() {
	fr(i,1,m) OUT(ans[i]);
}
signed main() {
	freopen("P1340_2.in","r",stdin);
	init();
	answer();
	print();
	return 0;
}
/*

*/
2022/10/15 12:02
加载中...