zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    [转]中国诗歌简史
    [转]古典诗词综述
    sqlite元数据
    hihocoder第226周:打表找规律
    理解bleu
    tensorflow代码中的一个bug
    tensorflow中的sequence_loss_by_example
    numpy二分查找
    一道贪心:加括号使算式的值最大
    kafaka可视化工具
  • 原文地址:https://www.cnblogs.com/Ressed/p/9863616.html
Copyright © 2011-2022 走看看