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\n",ans[i]);
return 0;
}