博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4751 Divide Groups 2013 ACM/ICPC Asia Regional Nanjing Online
阅读量:6801 次
发布时间:2019-06-26

本文共 1778 字,大约阅读时间需要 5 分钟。

题目链接:

题目大意:判断一堆人能否分成两组,组内人都互相认识。

解题思路:如果两个人不是相互认识,该两人之间连边。最终构成一张图,二分匹配。

1 #include
2 #include
3 #include
4 using namespace std; 5 #define maxn 105 6 #define maxm 20010 7 int n,e; 8 bool path[105][105],flag; 9 int first[maxn],next[maxm],v[maxm];10 int color[maxn];11 bool vis[maxn];12 void addedge(int x,int y)13 {14 v[e]=y;15 next[e]=first[x];16 first[x]=e++;17 }18 bool solve(int x,int now,int from)19 {20 int i,k;21 color[x]=now;22 for(i=first[x];i!=-1;i=next[i])23 {24 k=v[i];25 if(k!=from)26 {27 if(!color[k])28 {29 if(solve(k,-now,x)==false)return false;30 }31 if(color[k]==color[x])return false;32 }33 }34 vis[x]=true;35 return true;36 }37 int main()38 {39 int L,i;40 while(scanf("%d",&n)!=EOF)41 {42 memset(color,0,sizeof(color));43 memset(vis,false,sizeof(vis));44 memset(path,false,sizeof(path));45 for(i=1;i<=n;i++)46 {47 while(scanf("%d",&L),L)48 path[i][L]=true;49 }50 memset(first,-1,sizeof(first));51 for(i = 1; i < n;i++)52 {53 for(int j=i+1;j<=n;j++)54 {55 if(!path[i][j]||!path[j][i])56 {57 addedge(i,j);58 addedge(j,i);59 }60 }61 }62 flag=true;63 for(i=1;i<=n&&flag==true;i++)64 if(color[i]==0){65 vis[i]=true;flag=solve(i,1,-1);66 }67 if(flag)printf("YES\n");68 else printf("NO\n");69 }70 return 0;71 }
View Code

 

转载于:https://www.cnblogs.com/wuwing/p/3332382.html

你可能感兴趣的文章
IBM MQ 7.5开发版安装配置
查看>>
Shell 十三问学习笔记5
查看>>
华为PPP链路认证
查看>>
Zend Server 安装配置
查看>>
wuzhicms后台菜单的添加
查看>>
hadoop搭建
查看>>
修改默认defatu.prop
查看>>
我的友情链接
查看>>
【技术碰撞激情,“博”出精彩人生!】2013年度IT博客大赛开幕
查看>>
我的友情链接
查看>>
数据结构
查看>>
android.support.v4.view.NestedScrollingChild cannot be resolved
查看>>
PHP array_multisort() 函数详解 及 二维数组排序(模拟数据表记录按字段排序)
查看>>
java.util.ConcurrentModificationException异常参考解决方法
查看>>
Linux主机和VirtualBox虚拟机局域网互通
查看>>
SpringMVC之类型转换Converter
查看>>
谈谈神秘的ES6——(五)解构赋值【对象篇】
查看>>
Forrester企业级容器平台权威排行出炉,小初创Rancher缘何成为领导者?
查看>>
JS函数调用的问题
查看>>
智能合约语言 Solidity 教程系列6 - 结构体与映射
查看>>