二分图

BFS版:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn=100000+15;
 5 struct Edge {
 6     int x,y,next;
 7     Edge(int x=0,int y=0,int next=0):
 8         x(x),y(y),next(next) {}
 9 } edge[maxn*2];
10 int sumedge,head[maxn];
11 int n,m;
12 int ins(int x,int y) {
13     edge[++sumedge]=Edge(x,y,head[x]);
14     return head[x]=sumedge;
15 }
16 int h,t,que[maxn];
17 int col[maxn];
18 int main() { //假设连通
19     scanf("%d%d",&n,&m);
20     for (int i=1; i<=m; i++) {
21         int x,y;
22         scanf("%d%d",&x,&y);
23         ins(x,y);
24         ins(y,x);
25     }
26     memset(col,-1,sizeof(col));
27     que[h=t=1]=1;   //染色序列
28     col[1]=0;   //初始染色
29     for (; h<=t; h++) {
30         int x=que[h];
31         for (int u=head[x]; u; u=edge[u].next)
32             if (col[edge[u].y]!=-1) { //已经染过色
33                 if (col[edge[u].y]==col[x]) { //check
34                     printf("Wrong!\n");
35                     return 0;
36                 }
37             } else {
38                 col[edge[u].y]=col[x]^1;  //染色
39                 que[++t]=edge[u].y;
40             }
41     }
42     return 0;
43 }

并查集版:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn=100000+15;
 5 int n,m,top[maxn*2];
 6 int found(int x) {
 7     if (top[x]==x) return x;
 8     top[x]=found(top[x]);
 9     return top[x];
10 }
11 int main() {
12     scanf("%d%d",&n,&m);
13     for (int i=1; i<=2*n; i++) top[i]=i;
14     for (int i=1; i<=m; i++) {
15         int x,y;
16         scanf("%d%d",&x,&y);
17         int fx=found(2*x-1),fy=found(2*y);
18         //一个染白则另一个染黑
19         top[fx]=fy;
20         fx=found(2*x),fy=found(2*y-1);
21         //一个染黑则另一个染白
22         top[fx]=fy;
23     }
24     for (int i=1; i<=n; i++)
25         if (found(2*i-1)==found(2*i)) { //check
26             printf("Wrong!\n");
27             return 0;
28         }
29     return 0;
30 }
时间: 2024-08-03 23:39:17

二分图的相关文章

bzoj4025 二分图

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题解] 考虑对时间分治,用可撤回的启发式合并并查集来维护连通性. 二分图的条件是没有奇环,用并查集判即可. 对于时间区间[l,r],如果边在这期间都存在,那么就加入并查集,对于剩下的边分类,并且分治下去做. 对于每条边,在log个区间表示出来了,需要进行判断,启发式合并的getf是log的,所以复杂度为O(nlog^2n) # include <stdio.h> # includ

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

棋盘游戏(二分图匹配)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3200    Accepted Submission(s): 1897 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放

二分图【模板】

二分图:原图G的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y,则称该图为二分图. 二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,即一个顶点最多只有一条边.则称M是一个匹配. 二分图最大匹配:图中包含边数最多的匹配称为图的最大匹配. 二分图完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配. 二分图多重匹配:二分图匹配一对一匹配,这里允许集合Y中的一个元素和集合X中的多个元素匹配(一般有最大限制N)

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

POJ1325 Machine Schedule 【二分图最小顶点覆盖】

Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11958   Accepted: 5094 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduli

HDU 1045 Fire Net 二分图Bipartite题解

本题可以使用DFS直接爆搜出答案,不过这样类型的题目其实是个二分图的题解. 这个二分图,难不在Hungary算法,而是难在于建图.需要挺高的抽象思维的. 建图: 1 把同一行不被X分开的格子标同一个号码,被X分开的标下一个号码,这样做是为了缩点,不需要把所有的格子都分开标号,而且可以更方便建个更加小的图. 2 同理把同一列的格子标号 3 然后判断相同一个格子的行标号和列标号是有路径的,其他不在同一个格子的都是没有路径的. 4 这样就等于以行标号和列标号作为左右顶点,构建成一个二分图了 然后使用H

bzoj2539 丘比特的烦恼、黑书P333 (最优二分图匹配)

丘比特的烦恼 题目描述 Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是丘比特千里迢迢远赴中国,找到了掌管东方人爱情的神--月下老人,向他求教. 月下老人告诉丘比特,纯洁的爱情并不是不存在,而是他没有找到.在东方,人们讲究的是缘分.月下老人只要做一男一女两个泥人,在他们之间连上一条红线,那么它们所代表的人就会相爱--无论他们身处何地.而丘比特的爱

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

图论——LCA、强联通分量、桥、割顶、二分图最大匹配、网络流

A: 交通运输线 时间限制: 5 Sec  内存限制: 128 MB 题目描述 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路.当然在运输线中,更不可能存在圈. 现在,你的任务来了.给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度. 输入 第一行一个整数Case(Case<=10)表示测试数据