P1340 兽径管理

P1340 兽径管理

这道题van♂可以倒序做。

加边就是剪边

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node
{
	int point1;
	int point2;
	int dis;
	int num;
};
node line[7000];
bool compare(const node &a,const node &b)
{
	return a.dis<b.dis;
}
int n,m;
bool fail[7000];
bool usd[7000];
int ans[7000];
int mst=0;
int f[201];
int find(int x)
{
	if(f[x]==x)
		return x;
	return f[x]=find(f[x]);
}
void _set()
{
	mst=0;
	for(int i=1;i<=n;i++)
	{
		usd[i]=true;
		f[i]=i;
	}
	int get=0;
	for(int i=1;i<=m;i++)
	{
		int f1=find(line[i].point1),f2=find(line[i].point2);
		if(!fail[line[i].num]&&f1!=f2)
		{
			mst+=line[i].dis;
			get+=1;
			usd[line[i].num]=true;
			f[f1]=f2;
		}
	}
	if(get!=n-1)
		mst=-1;
	return ;
}
int main()
{
	scanf("%d%d",&n,&m);
	int a,b,c;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&line[i].point1,&line[i].point2,&line[i].dis);
		line[i].num=i;
	}
	sort(line+1,line+1+m,compare);
	_set();
	ans[m]=mst;
	for(int i=m;i>=1;i--)
	{
		fail[i]=true;
		if(usd[i])
			_set();
		ans[i-1]=mst;
	}
	for(int i=1;i<=m;i++)
		printf("%d
",ans[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/Lance1ot/p/8671637.html