HDU 2063--二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2063
该题解法思想是:
从第一个女生开始遍历,用女生去选择男生,男生这时还没被选走则马上选走他,接着第二个女生开始选,如果他想要的男生没被选走,当然就选上了,如果该男生已经被选走的话,则开始和前面的选择此男生的女生商量,看她能不能选择别的女生,如果可以的话,就叫该女生选择别的男生,则该男生就属于你了,如果和这个女生商量不成,则换一个男生接着匹配,若没有男生了,则只能守寡了,以此类推……
二分图思想:(匈牙利算法)
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。
(来自百度百科)更多关于二分图资料的请自己查找资料
代码:

1 #include<iostream> 2 using namespace std; 3 int visit[1500],map[1500][1500],dx[1500],dy[1500],nx,ny; 4 int dfs(int v) 5 { 6 for(int i=1;i<=ny;i++) 7 { 8 if(map[v][i]&&!visit[i]) 9 { 10 visit[i]=true; 11 if(!dy[i]||dfs(dy[i])) 12 { 13 dy[i]=v; 14 dx[v]=i; 15 return true; 16 } 17 } 18 } 19 return false; 20 } 21 int hungary() 22 { 23 int ans=0; 24 memset(dx,0,sizeof(dx)); 25 memset(dy,0,sizeof(dy)); 26 for(int i=1;i<=nx;i++) 27 { 28 if(!dx[i]) 29 { 30 memset(visit,0,sizeof(visit)); 31 ans+=dfs(i); 32 } 33 } 34 return ans; 35 } 36 int main() 37 { 38 int m,a,b; 39 while(cin>>m,m) 40 { 41 memset(map,0,sizeof(map)); 42 cin>>nx>>ny; 43 while(m--) 44 { 45 cin>>a>>b; 46 map[a][b]=1; 47 } 48 cout<<hungary()<<endl; 49 } 50 return 0; 51 }
posted on 2013-02-04 20:34 acoderworld 阅读(59) 评论(0) 收藏 举报
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 我最喜欢的 C# 14 新特性
· 程序员究竟要不要写文章
· 我是不是很有钱?
· 遭遇疯狂 cc 攻击的一个周末
· 【EF Core】聊聊“复合”属性
· GPT‑5 重磅发布
· 美丽而脆弱的天体运动:当C#遇见宇宙混沌