封锁阳光大学
题目描述
曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。
阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。
询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。
输入输出格式
输入格式:
第一行:两个整数N,M
接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。
输出格式:
仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。
#include<iostream> #include<cstdio> #include<cstring> #include<math.h> #include<algorithm> #include<queue> #include<vector> using namespace std; int n,m; vector<int>f[11000]; int t[11000],a[11000],h,ta,ans,b[11000],ans2,ans1; void bfs(int x) { h=1,ta=1; a[h]=x; t[x]=1; int ans1=1,ans2=0; while(h<=ta) { x=a[h]; b[x]=1; int o=t[x]; for(int i=0;i<f[x].size();i++) if(!b[f[x][i]]) { int oo=t[f[x][i]]; if(o==oo) {ans=-1;return;} a[++ta]=f[x][i]; t[f[x][i]]=o%2+1; if(t[f[x][i]]==1) ans1++; else ans2++; } h++; } h--; ans+=min(ans1,ans2); } int main() { scanf("%d%d",&n,&m); int aa,b; for(int i=1;i<=m;i++) { scanf("%d%d",&aa,&b); f[aa].push_back(b); f[b].push_back(aa); } for(int i=1;i<=n;i++) { if(!t[i]) bfs(i); if(ans==-1) {printf("Impossible");return 0;} } printf("%d",ans); return 0; }
可恶,我把两种染色记混了。