问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

匈牙利算法的样例程序

发布网友 发布时间:2023-09-11 08:49

我来回答

1个回答

热心网友 时间:2024-10-15 04:38

格式说明
输入格式:
第1行3个整数,V1,V2的节点数目n1,n2,G的边数m
第2-m+1行,每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连
输出格式:
1个整数ans,代表最大匹配数
邻接矩阵-C #include<stdio.h>#include<string.h>intn1, 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%d, &n1, &n2, &m);    for(int i = 1; i <= m; i++)    {        scanf(%d%d, &t1, &t2);        data[t1][t2] = true;    }    return;}bool find(inta){    for(int i = 1; i <= n2; 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; //记录查找成功记录                                result[a]  =  i;                returntrue;//返回查找成功            }        }    }    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;}邻接矩阵-pascal Programhungary;Constmax=100;Vardata:array[1..max,1..max]ofboolean;{邻接矩阵}result:array[1..max]ofinteger;{记录当前连接方式}state:array[1..max]ofboolean;{记录是否遍历过,防止死循环}m,n1,n2,i,t1,t2,ans:integer;Functiondfs(p:integer):boolean;vari:integer;beginfori:=1ton2doifdata[p,i]andnot(state[i])then{有边存在且没有被搜索过}beginstate[i]:=true;if(result[i]=0)ordfs(result[i])then{没有被连过或寻找到增广路}beginresult[i]:=p;exit(true);end;end;exit(false);end;beginreadln(n1,n2,m);fillchar(data,sizeof(data),0);fori:=1tomdobeginreadln(t1,t2);data[t1,t2]:=true;end;fillchar(result,sizeof(result),0);ans:=0;fori:=1ton1dobeginfillchar(state,sizeof(state),0);ifdfs(i)theninc(ans);end;writeln(ans);end.邻接表-C++ #include<iostream>#include<cstring>usingnamespacestd;//定义链表structlink{intdata;//存放数据link*next;//指向下一个节点link(int=0);};link::link(intn){data=n;next=NULL;}intn1,n2,m,ans=0;intresult[101];//记录n1中的点匹配的点的编号boolstate[101];//记录n1中的每个点是否被搜索过link*head[101];//记录n2中的点的邻接节点link*last[101];//邻接表的终止位置记录//判断能否找到从节点n开始的增广路boolfind(constintn){link*t=head[n];while(t!=NULL){//n仍有未查找的邻接节点时if(!(state[t->data])){//如果邻接点t->data未被查找过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匹配nreturntrue;//返回匹配成功的标志}}t=t->next;//继续查找下一个n的邻接节点}returnfalse;}intmain(){intt1=0,t2=0;cin>>n1>>n2>>m;for(inti=0;i<m;i++){cin>>t1>>t2;if(last[t1]==NULL)last[t1]=head[t1]=newlink(t2);elselast[t1]=last[t1]->next=newlink(t2);}for(inti=1;i<=n1;i++){memset(state,0,sizeof(state));if(find(i))ans++;}cout<<ans<<endl;return0;}邻接矩阵-C++ #include<iostream>#include<cstring>using namespace std;int map[105][105];int visit[105],flag[105];int n,m;bool dfs(int a){    for(int i=1; i<=n; i++)    {        if(map[a][i]&&!visit[i])        {            visit[i]=1;            if(flag[i]==0||dfs(flag[i]))            {                flag[i]=a;                return true;            }        }    }    return false;}int main(){    while(cin>>n1 >>n2 >>m)    {        memset(map,0,sizeof(map));        for(int i=1; i<=m; i++)        {            int x,y;            cin>>x>>y;            map[x][y]=1;        }        memset(flag,0,sizeof(flag));        int result=0;        for(int i=1; i<=n1; i++)        {            memset(visit,0,sizeof(visit));            if(dfs(i))result++;        }        cout<<result<<endl;    }    return 0;}邻接表-pascal(使用动态链表)
(方法基于之前的邻接矩阵-pascal) programhungarian_algorithm;//匈牙利算法typenode=^link;//链表定义link=recordg:longint;//指向节点next:node;end;varn1,n2,m,a,v1,v2,ans:longint;flag:array[1..1000000]ofboolean;//记录在main递归过程中是否已访问过,防止死循环nd:array[1..1000000]ofnode;//邻接表resultt:array[1..1000000]oflongint;//记录v2中节点的最终匹配于v1中的几号节点functionmain(wei:longint):boolean;varp:node;beginp:=nd[wei];whilep<>nildobeginifflag[p^.g]{没有被搜索过}thenbeginflag[p^.g]:=false;if(resultt[p^.g]=0)or(main(resultt[p^.g])){没有被连过或原来指向的节点寻找到新的增广路}thenbeginresultt[p^.g]:=wei;exit(true);end;end;p:=p^.next;end;exit(false)end;procereaddd(v1,v2:longint);//建立邻接表过程varp:node;beginnew(p);p^.g:=v2;p^.next:=nd[v1];nd[v1]:=p;end;beginreadln(n1,n2,m);fora:=1tomdobeginreadln(v1,v2);addd(v1,v2);end;ans:=0;fillchar(resultt,sizeof(resultt),0);fora:=1ton1dobeginfillchar(flag,sizeof(flag),true);ifmain(a)theninc(ans);end;writeln(ans);fora:=1ton2doifresultt[a]<>0thenwriteln(resultt[a],'---',a);end.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蒲公英根能过夜喝吗 ...会突然醒来,很难受,全身不能动,连嘴巴也张不开,眼睛... 适合N刷的原耽作品有哪些? bl原耽超好看的推荐记录本值得n刷 铝窗有哪些牌子好 在枣树,山楂树上吃树叶的那种虫子叫什么名字? 光纤面板特点 光纤桌面盒简介 哪些品牌的水光针物美价廉? ...被人领到了聊城铁路医院门诊说有专家坐诊,是被骗了吗? 手机贷,没有信用卡,如何分期贷款 韩国人为什么都睡地下?? 江城子·平沙浅草接天长的注释译文 极情纵欲的介绍 极情纵欲的意思是什么? 第一份工作,不能眼高手低 古文今译及点评 买车前这25件事情一定要知道? 有一个男人喜欢异性,但又喜欢摸男人的手臂,这是为什么? 购买厨房设备该如何记账 我是餐饮行业,每日用现金,采购后厨用的原材料,一部分直拨进厨房... 公司购买厨房用品计入哪个科目?如何做账? 餐饮公司如果要装修一个厨房造价是450万,拿合同融资能贷多少钱? 浓缩还原刺梨汁与非浓缩什么区别 饥荒在哪个app下载 中缝的结构中缝的结构是什么 工商银行的手机银行为什么不能自助注册了呢? 我要在网上用手机支付怎么... 夏普净化器拆开清洁 火葬场烧一具尸体需要大概多久 电脑前两天可以用 今天打开没网也没声音 但是wifi可以用 为什么 怎么... 注射隆鼻有哪几种?注射隆鼻的类型有哪些? 韭菜籽炒熟是什么颜色 关于读书的诗句大全阅读 淘宝交易记录最多能保存多久 除了电影院,还可以去哪里约会? 和平精英粽子手雷获取最全攻略大全 抖音发的投诉待补材料是什么 昆明滇池中学初中教学质量、校风、师资情况如何? 什么是打油诗人? 板式换热器循环原理图平面图 揭开地球的神秘面纱传奇大冒险读后感 指纹识别器不工作怎么办? 图片抠图成透明底在线-ps如何抠图去白底在手机上变透明底色?_百度... 呕吐 打一字 加急!! 百味庄园腌料好吃吗 怎么给QQ好友冲QB 秋日杂咏二十三首 其十一 咏妓馆是什么时候的诗 【双调】雁儿落过得胜令_懒栽番岳花原文|翻译|赏析_原文作者简介 铜陵天井庄园房产证在哪办? 谠规的解释谠规的解释是什么