zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    2017年3月9日上午学习
    3.17上午
    3.16上午
    3.16下午
    3.15
    2017.3.14
    3.14
    217.3.13上午
    2017.4.7-morning
    2017.4.6-afternoon
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8671637.html
Copyright © 2011-2022 走看看