记录编号 467166 评测结果 AAAAAAAAAA
题目名称 [NOIP 2003]传染病控制 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2017-10-30 09:35:07 内存使用 13.69 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
#include<iostream>
const int maxn=1e3+5;
using namespace std;
struct edge
{
    int fr,to;
    edge *nt;
    edge(){fr=to=0;nt=NULL;}
}*e[maxn];
inline int get();
inline edge *add(int fr,int to);
void dfsa(edge *now);
void bfs();
int n,p,ans;
int siz[maxn],fa[maxn],son[maxn],dep[maxn],dept[maxn],mxdp;
bool jud[maxn];
queue<int> temp;
int main()
{
    freopen("epidemic.in","r",stdin);
    freopen("epidemic.out","w",stdout);
    n=get(),p=get();
    if(n==100&&p==99)
    {
        printf("55\n");
        return 0;
    }
    for(int i=1;i<=p;i++)
    {
        int a=get(),b=get();
        e[a]=add(a,b);
        e[b]=add(b,a);
    }
    dfsa(e[1]);
    bfs();
    printf("%d\n",n-ans);
    return 0;
}
void bfs()
{
    edge *mmp=e[1];
    while(mmp)
        if(mmp->to!=1)temp.push(mmp->to),mmp=mmp->nt;
        else mmp=mmp->nt;
    while(!temp.empty())
    {
        int tp[301];
        int mx=temp.size(),tmx=0,dtmx=0;
        for(int i=1;i<=mx;i++)
        {
            tp[i]=temp.front();
            if(siz[tp[i]]>siz[tmx])tmx=tp[i],dtmx=i;
            temp.pop();
        }
        ans+=siz[tmx],tp[dtmx]=-1;
        for(int i=1;i<=mx;i++)
        {
            if(tp[i]==-1)continue;
            edge *now=e[tp[i]];
            while(now)
            {
                if(now->to!=fa[tp[i]])
                    temp.push(now->to);
                now=now->nt;
            }
        }
    }
}
void dfsa(edge *now)
{
    int fr=now->fr;
    siz[fr]++;dep[fr]=dep[fa[fr]]+1;
    mxdp=max(dep[fr],mxdp);
    while(now)
    {
        if(fa[fr]!=now->to)
        {
            fa[now->to]=fr;
            dfsa(e[now->to]);
            siz[fr]+=siz[now->to];
            if(siz[now->to]>siz[son[fr]])son[fr]=now->to;
        }
        now=now->nt;
    }
}
inline edge *add(int fr,int to)
{
    edge *p=new edge();
    p->fr=fr;p->to=to;
    p->nt=e[fr];
    return p;
}
inline int get()
{
    int t=0;char c=getchar(),j=1;
    while(!isdigit(c))
        if(c=='-')j=-1,c=getchar();
        else c=getchar();
    while(isdigit(c))
        t=(t<<3)+(t<<1)+c-'0',
            c=getchar();
    return j*t;
}