邻接矩阵-C #include <stdio.h> #include <string.h> int n1, n2, m, ans; int result[101]; //记录V2中的点匹配的点的编号 bool state [101]; //记录V2中的每个点是否被搜索过 bool data[101][101];//邻接矩阵 true代表有边相连 void init() { int t1, t2; memset(data, 0, sizeof(data)); memset(result, 0, sizeof(result)); ans = 0; scanf("%d%d", &n1, &n2, &m); for (int i = 1; i <= m; i++) { scanf("%d", &t1, &t2); data[t1][t2] = true; } return; } bool find(int a) { for (int i = 1; i <= m; i++) { if (data[a][i] == 1 && !state[i]) //如果节点i与a相邻并且未被查找过 { state[i] = true; //标记i为已查找过 if (result[i] == 0 //如果i未在前一个匹配M中 || find(result[i])) //i在匹配M中,但是从与i相邻的节点出发可以有增广路 { result[i] = a; //记录查找成功记录 return true; //返回查找成功 } } } return false; } int main() { init(); for (int i = 1; i <= n1; i++) { memset(state, 0, sizeof(state)); //清空上次搜索时的标记 if (find(i)) ans++; //从节点i尝试扩展 } printf("%d/n", ans); return 0; } 备注:匈牙利算法就是不断的扫描节点,构造出可能的增广路,然后将其与的匹配M进行取异或运算每次都能增加一个匹配,或淘汰一个点,直到扫描完全部节点。邻接表-C++ #include <iostream> #include <cstring> using namespace std; //定义链表 struct link { int data; //存放数据 link* next; //指向下一个节点 link(int=0); }; link::link(int n) { data=n; next=NULL; } int n1,n2,m,ans=0; int result[101]; //记录n1中的点匹配的点的编号 bool state [101]; //记录n1中的每个点是否被搜索过 link *head [101]; //记录n2中的点的邻接节点 link *last [101]; //邻接表的终止位置记录 //判断能否找到从节点n开始的增广路 bool find(const int n) { link* t=head[n]; while (t!=NULL) //n仍有未查找的邻接节点时 { if (!(state[t->data])) //如果邻接点t->data未被查找过//state在邻接表中仍然是不能省的要防止其他节点再次用它 { state[t->data]=true; //标记t->data为已经被找过 if ((result[t->data]==0) || //如果t->data不属于前一个匹配M (find(result[t->data]))) //如果t->data匹配到的节点可以寻找到增广路 { result[t->data]=n; //那么可以更新匹配M',其中n1中的点t->data匹配n return true; //返回匹配成功的标志 } } t=t->next; //继续查找下一个n的邻接节点 } return false; } int main() { int t1=0, t2=0; cin>>n1>>n2>>m; for (int i=0; i<m; i++) { cin>>t1>>t2; if (last[t1]==NULL) last[t1]=head[t1] //这是其中一种邻接表的构造实现还可以是直接加表头 =new link(t2); else last[t1]=last[t1]->next =new link(t2); } for (int i=1; i<=n1; i++) { memset(state, 0, sizeof(state)); if (find(i)) ans++; } cout<<ans<<endl; return 0; } 应用:根据图论中的Konig定理,最小覆盖数=最大匹配数,pku3041Asteroids