Luogu1330封锁阳光大学(二分图染色、搜索)

【题干】

阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。

询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。

 

【解题】

二分图染色。

因为可能不连通所以要遍历每个点,记得数组初始化。

学一学换颜色和结束函数的操作。

#include<bits/stdc++.h>
using namespace std;
const int N = 500005;
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
    return x * f;
}

int n,m,a,b,len,x,t, ans; 
int head[N],c[N],vis[N];
struct node{
    int v,next;
}e[N];

inline void adde(int u, int v){
    e[++len].next =  head[u];
    head[u] = len;
    e[len].v = v;
}
void dfs(int wqy,int t){
    if(c[wqy] != -1 && c[wqy] != t){
        printf("Impossible");
        exit(0);
    }
    
    if(c[wqy] == t) return ; 
    
    x++;
    c[wqy] = t;
    vis[wqy] = 1;
    for(int i = head[wqy]; i; i = e[i].next)  {
        int v = e[i].v;
        dfs(v,t^1);
    }
}
int main(){
    n = read(), m = read();
    for(register int i = 1; i <= m; ++i){
        a = read(), b = read();
        adde(a,b);
        adde(b,a);
    }
    
    for(int i = 1; i <= n; i++){  //每个点都要遍历因为图可能不连通 
      if(!vis[i]){
          memset(c,-1,sizeof c);
        t = 0, x = 0;
        dfs(i,0);
        t = 0;
        for(register int i = 1; i <= n; ++i)    t += (c[i] == 0);
        ans += min(t,x-t);
      }
      
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2019-11-14 20:25  QUEKI嶺冬  阅读(106)  评论(0编辑  收藏  举报
/*! Color themes for Google Code Prettify | MIT License | github.com/jmblog/color-themes-for-google-code-prettify */ .pln{color:#4d4d4c}ol.linenums{margin-top:0;margin-bottom:0;color:#8e908c}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#fff;list-style-type:decimal!important;}@media screen{.str{color:#718c00}.kwd{color:#8959a8}.com{color:#8e908c}.typ{color:#4271ae}.lit{color:#f5871f}.pun{color:#4d4d4c}.opn{color:#4d4d4c}.clo{color:#4d4d4c}.tag{color:#c82829}.atn{color:#f5871f}.atv{color:#3e999f}.dec{color:#f5871f}.var{color:#c82829}.fun{color:#4271ae}} /*下面是我设置背景色,字体大小和字体*/ .cnblogs-markdown code{ background:#fff!important; } .cnblogs_code,.cnblogs_code span,.cnblogs-markdown .hljs{ font-size:16px!important; } .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, .syntaxhighlighter table, .syntaxhighlighter table td, .syntaxhighlighter table tr, .syntaxhighlighter table tbody, .syntaxhighlighter table thead, .syntaxhighlighter table caption, .syntaxhighlighter textarea { font-size: 16px!important; } .cnblogs_code, .cnblogs_code span, .cnblogs-markdown .hljs{ font-family:consolas, "Source Code Pro", monaco, monospace !important; } //以上是代码高亮 /* 文字特效 */