记录编号 442234 评测结果 AAAAAAAAAA
题目名称 [NOIP 2003]传染病控制 最终得分 100
用户昵称 Gravatarxzz_233 是否通过 通过
代码语言 C++ 运行时间 0.052 s
提交时间 2017-08-26 17:05:06 内存使用 0.67 MiB
显示代码纯文本
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<vector>
#define Fname "epidemic"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0,f=1;rg char ch=getchar();
    while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int maxn=310,maxm=maxn<<1;
int fir[maxn],nxt[maxm],dis[maxm];
int siz[maxn],dfn[maxn],k[maxn],s[maxn][maxn],ans=1e9,n;
il vd DFS(int now,int dep=1,int fa=-1){
    s[dep][++k[dep]]=now;
    siz[now]=1,dfn[now]=++dfn[0];
    erep(i,now)if(dis[i]^fa)DFS(dis[i],dep+1,now),siz[now]+=siz[dis[i]];
}
int tree[maxn];
il vd add(int p,int k){while(p<=n)tree[p]+=k,p+=p&-p;}
il int summ(int p){int ret=0;while(p)ret+=tree[p],p-=p&-p;return ret;}
il vd dfs(int now,int gg){
    if(gg>=ans)return;
    if(!k[now]){ans=gg;return;}
    int sum=0;
    rep(i,1,k[now])if(!summ(dfn[s[now][i]]))++sum;
    if(gg+sum-1>=ans)return;
    if(sum==1||sum==0){ans=min(ans,gg);return;}
    rep(i,1,k[now])if(!summ(dfn[s[now][i]])){
	add(dfn[s[now][i]],1);
	add(dfn[s[now][i]]+siz[s[now][i]],-1);
	dfs(now+1,gg+sum-1);
	add(dfn[s[now][i]],-1);
	add(dfn[s[now][i]]+siz[s[now][i]],1);
    }
}
int main(){
    freopen(Fname".in","r",stdin);
    freopen(Fname".out","w",stdout);
    n=gi();
    int m=gi(),id=0;
    rep(i,1,m){
	int a=gi(),b=gi();
	nxt[++id]=fir[a],fir[a]=id,dis[id]=b;
	nxt[++id]=fir[b],fir[b]=id,dis[id]=a;
    }
    DFS(1);
    dfs(2,1);
    printf("%d\n",ans);
    return 0;
}