标签:break mod remember 输出 number inpu cannot oms print
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7091 Accepted Submission(s):
3169
二分图染色+匹配
#include <cstring> #include <cstdio> #include <vector> #include <queue> #define N 300 using namespace std; vector<int>G[N]; bool vis[N],flag; int Map[N][N],match[N],col[N],cnt,n,m; int dfs(int x) { for(int i=1;i<=n;++i) { if(Map[x][i]&&!vis[i]) { vis[i]=1; if(!match[i]||dfs(match[i])) { match[i]=x; return 1; } } } return 0; } bool rs(int x) { queue<int>q; q.push(x); col[x]=0; for(int now;!q.empty();) { now=q.front(); q.pop(); for(int i=0;i<G[now].size();++i) { int v=G[now][i]; if(col[v]!=-1) {if(col[now]==col[v]) {flag=1;return true;}} else { col[v]=col[now]^1; q.push(v); } } } return false; } int main() { for(int last=0;scanf("%d%d",&n,&m)!=EOF;last=n) { for(int i=1;i<=last;++i) G[i].clear(); int ans=0; flag=false; memset(Map,0,sizeof(Map)); memset(col,-1,sizeof(col)); memset(match,0,sizeof(match)); for(int x,y;m--;) { scanf("%d%d",&x,&y); Map[x][y]=1; G[x].push_back(y); G[y].push_back(x); } for(int i=1;i<=n;++i) if(col[i]==-1) if(rs(i)) break; if(flag) {printf("No\n");continue;} for(int i=1;i<=n;++i) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",ans); } return 0; }
hdu 2444 The Accomodation of Students
标签:break mod remember 输出 number inpu cannot oms print
原文地址:http://www.cnblogs.com/ruojisun/p/7435498.html