标签:live amp otherwise mit 输出 hdu push task 二分
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7086 Accepted Submission(s): 3167
题目:一些学生之间是朋友关系(关系不能传递),现在要将一堆学生分成两堆,使得在同一堆的学生之间没有朋友关系。如果不可以输出“No”,可以的话输出最多可以分出几对小盆友。
思路:
我们先二分图染色,若能被染成两部分的话说明可以被分成两部分,然后再在我们分出的图上面跑最大匹配。若不能被染成两部分直接输出no
代码:
#include<queue> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 510 using namespace std; bool flag,vis[N]; int n,m,x,y,tot,ans,col[N],girl[N],head[N],map[N][N]; queue<int>q; struct Edge { int from,to,next; }edge[N*N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int add(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=head[x]; head[x]=tot; } int find(int x) { for(int i=1;i<=n;i++) { if(!vis[i]&&map[x][i]) { vis[i]=true; if(girl[i]==-1||find(girl[i])){girl[i]=x; return 1;} } } return 0; } int color(int s) { queue<int>q; q.push(s); col[s]=0; while(!q.empty()) { int x=q.front(); for(int i=head[x];i;i=edge[i].next) { int t=edge[i].to; if(col[t]!=-1){if(col[t]==col[x]) {flag=true; return 1;}} else { col[t]=col[x]^1; q.push(t); } } q.pop(); } return 0; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { ans=0;flag=false;tot=0; memset(map,0,sizeof(map)); memset(col,-1,sizeof(col)); memset(edge,0,sizeof(edge)); memset(head,0,sizeof(head)); for(int i=1;i<=m;i++) { x=read(),y=read(); map[x][y]=1; add(x,y),add(y,x); } for(int i=1;i<=n;i++) if(col[i]==-1) { if(color(i)) break; } if(flag) {printf("No\n"); continue;} memset(girl,-1,sizeof(girl)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } printf("%d\n",ans); } return 0; }
HDU——2444 The Accomodation of Students
标签:live amp otherwise mit 输出 hdu push task 二分
原文地址:http://www.cnblogs.com/z360/p/7435411.html