1. 程式人生 > >洛谷——P1330 封鎖陽光大學

洛谷——P1330 封鎖陽光大學

ace log 輸出格式 mem ref can black void 無法

https://www.luogu.org/problem/show?pid=1330#sub

題目描述

曹是一只愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裏刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。

陽光大學的校園是一張由N個點構成的無向圖,N個點之間由M條道路連接。每只河蟹可以對一個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩只河蟹封鎖了相鄰的兩個點時,他們會發生沖突。

詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生沖突。

輸入輸出格式

輸入格式:

第一行:兩個整數N,M

接下來M行:每行兩個整數A,B,表示點A到點B之間有道路相連。

輸出格式:

僅一行:如果河蟹無法封鎖所有道路,則輸出“Impossible”,否則輸出一個整數,表示最少需要多少只河蟹。

輸入輸出樣例

輸入樣例#1:
【輸入樣例1】
3 3
1 2
1 3
2 3

【輸入樣例2】
3 2
1 2
2 3

輸出樣例#1:
【輸出樣例1】
Impossible

【輸出樣例2】
1

說明

【數據規模】

1<=N<=10000,1<=M<=100000,任意兩點之間最多有一條道路。

二分圖染色,圖可能不連通,ans每次加上一塊圖的最小花費

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 
 6 using namespace std;
 7 
 8 const int N(10000+15);
 9 const int M(100000+5);
10 int n,m,u,v,ans;
11 
12 int head[N],sumedge;
13 struct Edge
14
{ 15 int v,next; 16 Edge(int v=0,int next=0): 17 v(v),next(next){} 18 }edge[M<<1]; 19 void ins(int u,int v) 20 { 21 edge[++sumedge]=Edge(v,head[u]); 22 head[u]=sumedge; 23 } 24 25 queue<int>que; 26 int col[N]; 27 int Paint(int s) 28 { 29 int colblack=0,colwhite=0; 30 col[s]=0; colblack++; 31 que.push(s); 32 for(;!que.empty();) 33 { 34 int fro=que.front();que.pop(); 35 for(int i=head[fro];i;i=edge[i].next) 36 { 37 v=edge[i].v; 38 if(col[v]==-1) 39 { 40 col[v]=col[fro]^1; 41 if(col[v]==0) colblack++; 42 else colwhite++; 43 que.push(v); 44 } 45 else if(col[v]==col[fro]) 46 { 47 printf("Impossible"); 48 exit(0); 49 } 50 } 51 } 52 return min(colblack,colwhite); 53 } 54 55 int main() 56 { 57 scanf("%d%d",&n,&m); 58 for(;m--;) 59 { 60 scanf("%d%d",&u,&v); 61 ins(u,v);ins(v,u); 62 } 63 memset(col,-1,sizeof(col)); 64 for(int i=1;i<=n;i++) 65 if(col[i]==-1) ans+=Paint(i); 66 printf("%d",ans); 67 return 0; 68 }

洛谷——P1330 封鎖陽光大學