• 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
    ",ans);
    50     else printf("Impossible");
    51     return 0;
    52 }
  • 相关阅读:
    SQL CHECKOUT
    Adobe CS4 " Licensing for this product has expired " FIX!!!
    sizeof()用法汇总
    Command
    EXP_FULL_DATABASE,IMP_FULL_DATABASE,DBA,CONNECT,RESOURCE
    inet_addr函数处理IP地址需要注意的问题 (转)
    Oracle:外键关联导致数据无法删除
    三范式
    Wireshark界面上展开数据帧
    我的HTML学习记录(三)
  • 原文地址:https://www.cnblogs.com/Ressed/p/9863616.html
Copyright © 2020-2023  润新知