洛谷——P1330 封鎖陽光大學
阿新 • • 發佈:2017-06-24
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 封鎖陽光大學