BZOJ 3391 Tree Cutting网络破坏

Posted on 2016-07-29 12:44  ziliuziliu  阅读(152)  评论(0编辑  收藏  举报

不想写。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
#define pa pair<int,int>
#define inf 1000000000
#define ll long long 
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,cnt,ind,ans;
int dfn[10005],low[10005],last[10005],size[10005];
bool mark[10005];
struct edge{int to,next;}e[20005];
void insert(int u,int v)
{
    e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;
    e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}
void tarjan(int x)
{
    
    dfn[x]=low[x]=++ind;
    size[x]=1;
    int t=0,res=n-1;
    for(int i=last[x];i;i=e[i].next)
        if(!dfn[e[i].to])
        {
            tarjan(e[i].to);
            size[x]+=size[e[i].to];
            low[x]=min(low[x],low[e[i].to]);
            if(low[e[i].to]>=dfn[x])
            {
                t=max(t,size[e[i].to]);
                res-=size[e[i].to];
            }
        }
        else low[x]=min(low[x],dfn[e[i].to]);
    t=max(t,res);
    if(t<=n/2)
    {
        ans++;
        mark[x]=1;
    }
}
int main()
{
    n=read();
    for(int i=1;i<n;i++)
    {
        int u=read(),v=read();
        insert(u,v);
    }
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    if(!ans)puts("NONE");
    else 
        for(int i=1;i<=n;i++)
            if(mark[i])printf("%d\n",i);
    return 0;
}