博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图
阅读量:5099 次
发布时间:2019-06-13

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

  题目分析:

    一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人。一个人喜欢的动物如果离开,那么他也将离开。问最多留下多少人。

  思路:

    爱猫和爱狗的人是两个独立的集合。若两个人喜欢和讨厌的动物是一样的,那么就建一条边。留下多少人,就是求最大独立集。

    最大独立集= 顶点数 - 最大匹配数

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int N=505,INF=0x3f3f3f3f; 8 int bmap[N][N],cx[N],cy[N],dx[N],dy[N]; 9 bool bmask[N]; 10 int nx,ny,dis,ans; 11 bool searchpath() 12 { 13 queue
q; 14 dis=INF; 15 memset(dx,-1,sizeof(dx)); 16 memset(dy,-1,sizeof(dy)); 17 for(int i=1;i<=nx;i++) 18 { 19 if(cx[i]==-1){ q.push(i); dx[i]=0; } 20 while(!q.empty()) 21 { 22 int u=q.front(); q.pop(); 23 if(dx[u]>dis) break; 24 for(int v=1;v<=ny;v++) 25 { 26 if(bmap[u][v]&&dy[v]==-1) 27 { 28 dy[v]= dx[u] + 1; 29 if(cy[v]==-1) dis=dy[v]; 30 else 31 { 32 dx[cy[v]]= dy[v]+1; 33 q.push(cy[v]); 34 } 35 } 36 } 37 } 38 } 39 return dis!=INF; 40 } 41 int findpath(int u) 42 { 43 for(int v=1;v<=ny;v++) 44 { 45 if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1) 46 { 47 bmask[v]=1; 48 if(cy[v]!=-1&&dy[v]==dis) continue; 49 if(cy[v]==-1||findpath(cy[v])) 50 { 51 cy[v]=u; cx[u]=v; 52 return 1; 53 } 54 } 55 } 56 return 0; 57 } 58 void maxmatch() 59 { 60 ans=0; 61 memset(cx,-1,sizeof(cx)); 62 memset(cy,-1,sizeof(cy)); 63 while(searchpath()) 64 { 65 memset(bmask,0,sizeof(bmask)); 66 for(int i=1;i<=nx;i++) 67 if(cx[i]==-1) ans+=findpath(i); 68 } 69 } 70 void init() 71 { 72 memset(bmap,0,sizeof(bmap)); 73 } 74 struct node 75 { 76 int x,y; 77 }c[N],d[N]; 78 int main() 79 { 80 //freopen("test.txt","r",stdin); 81 int cas,i,j,k,n,a,b; 82 char ch; 83 scanf("%d",&cas); 84 while(cas--) 85 { 86 scanf("%d%d%d",&a,&b,&n); 87 init(); 88 j=k=0; 89 for(i=1;i<=n;i++) 90 { 91 getchar(); 92 ch=getchar(); 93 if(ch=='C') { 94 scanf("%d",&a); 95 c[j].x=a; 96 } 97 if(ch=='D') { 98 scanf("%d",&a); 99 d[k].y=a;100 }101 scanf(" %c",&ch);102 if(ch=='C') {103 scanf("%d",&a);104 d[k++].x=a;105 }106 if(ch=='D') {107 scanf("%d",&a);108 c[j++].y=a;109 }110 }111 nx=j;ny=k;112 for(i=0;i
View Code

 

转载于:https://www.cnblogs.com/Potato-lover/p/3986028.html

你可能感兴趣的文章
JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
查看>>
查看SQLServer的QUOTED_IDENTIFIER等配置
查看>>
[转]构建基于WCF Restful Service的服务
查看>>
数据访问
查看>>
php基础知识测试总结
查看>>
Apache Cordova
查看>>
java随笔一(关于定时任务)
查看>>
Codeforces 975D Ghosts 【math】
查看>>
Oracle expdp/impdp导出导入命令及数据库备份
查看>>
HDU 1074 Doing Homework (dp+状态压缩)
查看>>
JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
查看>>
Cocos2dx使用wxsqlite开源加密SQLite3数据库
查看>>
linux —— shell 编程(编程语法)
查看>>
2011计算机二级c语言考点:二维数组
查看>>
T-SQL:毕业生出门需知系列(六)
查看>>
[C#] 获取计算机内部信息 - ComputerInfoHelper
查看>>
概率算法_二项分布和泊松分布
查看>>
crontab命令使用文档.txt
查看>>
Luogu2986 [USACO10MAR]伟大的奶牛聚集 (树形DP)
查看>>
在JasperReport中填充JavaBean(4)
查看>>