hdu2444二分图判定 + 最大匹配

来源:互联网 发布:水产加工erp软件 编辑:程序博客网 时间:2024/05/01 16:10

思路:用染色法进行二分图判定,相邻的两个点间染不同的颜色,如果遇见相同的颜色,则不是二分图;

不是二分图的话输出No,否则跑Hungary求最大匹配;

点击打开链接

/*****************************************Author      :Crazy_AC(JamesQi)Time        :2015File Name   :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <limits.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof a)#define pk push_backtemplate<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}typedef long long ll;typedef pair<int,int> ii;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;int uN,vN,n,m;const int maxn = 220;int gg[maxn][maxn];bool vis[maxn];int link[maxn];bool dfs(int u){for (int i = 0;i < vN;i++){if (gg[u][i] && !vis[i]){vis[i] = true;if (link[i] == -1 || dfs(link[i])){link[i] = u;return true;}}}return false;}inline int Hungary(){MEM(link, -1);int ret = 0;for (int i = 0;i < uN;++i){MEM(vis, false);if (dfs(i)) ret++;}return ret;}int color[maxn];vector<int> vec[maxn];bool SetColor(int u,int col){color[u] = col;for (int i = 0;i < vec[u].size();++i){int v = vec[u][i];if (color[v] != -1){if (color[v] == col) return false;continue;}if (!SetColor(v, !col)) return false;}return true;}int num[maxn];int main(){// ios::sync_with_stdio(false);// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);while(~scanf("%d%d",&n,&m)){for (int i = 0;i < n;++i)vec[i].clear();int u,v;while(m--){scanf("%d%d",&u,&v);u--,v--;vec[u].push_back(v);}MEM(color, -1);bool flag = true;for (int i = 0;i < n;++i){if (color[i] != -1) continue;if (!SetColor(i,0)){flag = false;break;}}if (!flag){printf("No\n");continue;}vN = uN = 0;for (int i = 0;i < n;++i){if (color[i] == 0) num[i] = uN++;else num[i] = vN++;}MEM(gg, 0);for (int i = 0;i < n;++i){for (int j = 0;j < vec[i].size();j++){if (color[i] == 0){u = num[i];v = num[vec[i][j]];gg[u][v] = 1;}else{u = num[vec[i][j]];v = num[i];gg[u][v] = 1;}}}printf("%d\n",Hungary());}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大专毕业拿不到毕业证怎么办 高考差一分二本怎么办 3个月宝宝大小眼怎么办 华东交大理工学院没有评教怎么办 学校断4g网怎么办 学校移动4g网卡怎么办 没上专科线怎么办福建 联考没过本科线怎么办 拍婚纱拍的脸歪怎么办? 老婆彻底寒心要离婚怎么办 手机被同学偷了怎么办 钱被同学偷了怎么办 上班穿皮鞋脚疼怎么办 高跟靴子买大了怎么办 我怀了第三个小孩怎么办? 离婚前把钱花了怎么办 对谈对象有压力怎么办 和对象感情淡了怎么办 孩子处对象学习下降怎么办 孩子高三成绩差怎么办 老妈怨气太重怎么办 广东小高考有d怎么办 高考考生档案袋有个小洞怎么办 江苏省考生出省后小高考成绩怎么办 江苏小高考三D怎么办 小高考补考没过怎么办 理科高考200多分怎么办 高考没考过200分怎么办 电子手表指针不走了怎么办 家长说你教的不好怎么办 小升初分班考试考砸了怎么办 老公不给老婆看病怎么办 孕妈妈涨奶严重怎么办 90岁老头尿不下尿怎么办 妻子要离婚丈夫不离怎么办 弟媳妇天天在家吵架怎么办 弟媳妇不和我说话怎么办 我想和弟媳妇做一次怎么办 老公对弟媳妇有非分之想怎么办 跟弟媳妇有矛盾怎么办 学生考试前不认真怎么办