1. 程式人生 > >Luogu P1330 封鎖陽光大學

Luogu P1330 封鎖陽光大學

continue bsp min class ble 就是 pac cst ont

解題思路

顯然相鄰的兩個點是不能夠同時存在河蟹的,那就對每兩個相鄰的點進行染色操作,一個染成黑點,一個染成白點。一個很容易想到的事實就是如果在染色的過程中對某一點的操作和之前染的色沖突,那麽河蟹就無法成功阻攔老曹刷街

附上代碼

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

const int maxn = 2e5+3;
int n, m, fir[maxn], nx[maxn], u[maxn], v[maxn];
int col[maxn], cnt, sum[4], Ans; bool vis[maxn]; struct node { int n1, n2, x, tot, c; }tmp; queue<node> Q; inline void addedge(int fr, int to) { nx[++cnt] = fir[fr]; u[cnt] = fr, v[cnt] = to; fir[fr] = cnt; } inline bool dfs(int s, int color) { if(vis[s]) {
if(color == col[s]) return true; else return false; } vis[s] = true; col[s] = color; sum[col[s]] ++; int k = fir[s]; bool fin = true; while(k != -1) { fin = fin && dfs(v[k], col[s] ? 0 : 1); k = nx[k]; } return fin; }
int main() { scanf("%d%d", &n, &m); memset(fir, -1, sizeof(fir)); int x, y; for(int i=1; i<=m; i++) { scanf("%d%d", &x, &y); addedge(x, y), addedge(y, x); } for(int i=1; i<=n; i++) { if(vis[i]) continue; sum[0] = sum[1] = 0; if(!dfs(i, 0)) { printf("Impossible\n"); return 0; } Ans += min(sum[1], sum[0]); } printf("%d", Ans); }

Luogu P1330 封鎖陽光大學