luogu1330 封锁阳光大学 (dfs)

给每一个联通块黑白染色(一条边两端点不同色),看是否能染

然后选那个出现次数比较少的颜色

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=1e4+10,maxm=2e5+10;
 7 
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
12     return x*neg;
13 }
14 
15 int eg[maxm][2],egh[maxn],ect;
16 int N,M;
17 int flag[maxn];
18 
19 inline void adeg(int a,int b){
20     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
21 }
22 
23 void dfs(int x,int y,int &c1,int &c2){
24     if(y==1) c1++;else c2++;
25     flag[x]=y;
26     for(int i=egh[x];i;i=eg[i][1]){
27         int b=eg[i][0];
28         if(flag[b]==flag[x]) c1=-(1e9);
29         else if(!flag[b]) dfs(b,y==1?2:1,c1,c2);
30     }
31 }
32 
33 int main(){
34     //freopen("","r",stdin);
35     int i;
36     N=rd(),M=rd();
37     for(i=1;i<=M;i++){
38         int a=rd(),b=rd();
39         adeg(a,b);adeg(b,a);
40     }
41     int ans=0;
42     for(i=1;i<=N;i++){
43         int a=0,b=0;
44         if(flag[i]) continue;
45         dfs(i,1,a,b);
46         ans+=min(a,b);
47         if(ans<0) break;
48     }
49     if(ans>=0) printf("%d\n",ans);
50     else printf("Impossible");
51     return 0;
52 }

 

posted @ 2018-10-27 21:55  Ressed  阅读(137)  评论(0编辑  收藏  举报