亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 指派問題的匈牙利算法.cpp

?? 一種用于解決分配問題的算法,歡迎大家批評指正.
?? CPP
字號:
/**********************************************************************\
*                    指派問題的匈牙利算法                              *
*                         
*                                                                      *
\**********************************************************************/






#include<stdio.h>

typedef struct matrix
{
	float cost[101][101];
    int zeroelem[101][101];
	float costforout[101][101];
	int matrixsize;
	int personnumber;
	int jobnumber;
}matrix;

matrix sb;
int result[501][2];

void twozero(matrix &sb);
void judge(matrix &sb,int result[501][2]);
void refresh(matrix &sb);
void circlezero(matrix &sb);
matrix input();
void output(int result[501][2],matrix sb);
void zeroout(matrix &sb);






matrix input()
{
	matrix sb;
	int m;
	int pnumber,jnumber;
	int i,j;
	float k;
	char w;
	printf("指派問題的匈牙利解法:\n");
	printf("max,請輸入1;min,請輸入0:\n");
	scanf("%d",&m);
	while (m!=1&&m!=0)
	{	
		printf("請輸入1或0:\n");
		scanf("%d",&m);
	}
	printf("請輸入人數(shù)(人數(shù)介于1和100之間):\n");
	scanf("%d",&pnumber);
	while(pnumber<1 || pnumber>100)
	{
		printf("請輸入合法數(shù)據(jù):\n");
		scanf("%d",&pnumber);
	}
	printf("請輸入工件數(shù)(介于1和100之間):\n");
	scanf("%d",&jnumber);
	while(jnumber<1 || jnumber>100)
	{
		printf("請輸入合法數(shù)據(jù):\n");
		scanf("%d",&jnumber);
	}
	printf("請輸入%d行%d列的矩陣,同一行內(nèi)以空格間隔,不同行間以回車分隔:\n",pnumber,jnumber);
	for(i=1;i<=pnumber;i++)
		for(j=1;j<=jnumber;j++)
		{
			scanf("%f",&sb.cost[i][j]);
			sb.costforout[i][j]=sb.cost[i][j];
		}
	scanf("%c",&w);        //吸收回車符
	if(jnumber>pnumber)
		for(i=pnumber+1;i<=jnumber;i++)
			for(j=1;j<=jnumber;j++)
			{
				sb.cost[i][j]=0;
				sb.costforout[i][j]=0;
			}
	else
	{
		if(pnumber>jnumber)
			for(i=1;i<=pnumber;i++)
				for(j=jnumber+1;j<=pnumber;j++)
				{
					sb.cost[i][j]=0;
					sb.costforout[i][j]=0;
				}

	}
	sb.matrixsize=pnumber;
	if(pnumber<jnumber)
		sb.matrixsize=jnumber;
	sb.personnumber=pnumber;
	sb.jobnumber=jnumber;
	if(m==1)
	{
		k=0;
		for(i=1;i<=sb.matrixsize;i++)
			for(j=1;j<=sb.matrixsize;j++)
				if(sb.cost[i][j]>k)
					k=sb.cost[i][j];
		for(i=1;i<=sb.matrixsize;i++)
			for(j=1;j<=sb.matrixsize;j++)
				sb.cost[i][j]=k-sb.cost[i][j];
	}
	return sb;
}//input


void circlezero(matrix &sb)
{
	int i,j;
	float k;
	int p;
	for(i=0;i<=sb.matrixsize;i++)
		sb.cost[i][0]=0;
	for(j=1;j<=sb.matrixsize;j++)
		sb.cost[0][j]=0;
	for(i=1;i<=sb.matrixsize;i++)
		for(j=1;j<=sb.matrixsize;j++)
			if(sb.cost[i][j]==0)
			{
				sb.cost[i][0]++;
				sb.cost[0][j]++;
				sb.cost[0][0]++;
			}
	for(i=0;i<=sb.matrixsize;i++)
		for(j=0;j<=sb.matrixsize;j++)
			sb.zeroelem[i][j]=0;
	  
	k=sb.cost[0][0]+1;
	while(sb.cost[0][0]<k)
	{
		k=sb.cost[0][0];
		for(i=1;i<=sb.matrixsize;i++)
		{
			if(sb.cost[i][0]==1)
			{
				for(j=1;j<=sb.matrixsize;j++)
					if(sb.cost[i][j]==0&&sb.zeroelem[i][j]==0)
						break;
				sb.zeroelem[i][j]=1;
				sb.cost[i][0]--;
				sb.cost[0][j]--;
				sb.cost[0][0]--;
				if(sb.cost[0][j]>0)
					for(p=1;p<=sb.matrixsize;p++)
						if(sb.cost[p][j]==0&&sb.zeroelem[p][j]==0)
						{
							sb.zeroelem[p][j]=2;
							sb.cost[p][0]--;
							sb.cost[0][j]--;
							sb.cost[0][0]--;
						}
			}
		}
		for(j=1;j<=sb.matrixsize;j++)
		{
			if(sb.cost[0][j]==1)
			{
				for(i=1;i<=sb.matrixsize;i++)
					if(sb.cost[i][j]==0&&sb.zeroelem[i][j]==0)
						break;
				sb.zeroelem[i][j]=1;
				sb.cost[i][0]--;
				sb.cost[0][j]--;
				sb.cost[0][0]--;
				if(sb.cost[i][0]>0)
					for(p=1;p<=sb.matrixsize;p++)
						if(sb.cost[i][p]==0&&sb.zeroelem[i][p]==0)
						{
							sb.zeroelem[i][p]=2;
							sb.cost[i][0]--;
							sb.cost[0][p]--;
							sb.cost[0][0]--;
						}
			}
		}
	}//while
	if(sb.cost[0][0]>0)
		twozero(sb);
	else
		judge(sb,result);
}//circlezero


void twozero(matrix &sb)
{
	int i,j;
	int p,q;
	int m,n;
	float k;
    matrix st;
	for(i=1;i<=sb.matrixsize;i++)
		if(sb.cost[i][0]>0)
			break;
	if(i<=sb.matrixsize)
	{
		for(j=1;j<=sb.matrixsize;j++)
		{
			st=sb;//pay attention
			if(sb.cost[i][j]==0&&sb.zeroelem[i][j]==0)
			{
				sb.zeroelem[i][j]=1;
				sb.cost[i][0]--;
				sb.cost[0][j]--;
				sb.cost[0][0]--;
				for(q=1;q<=sb.matrixsize;q++)
					if(sb.cost[i][q]==0&&sb.zeroelem[i][q]==0)
					{
						sb.zeroelem[i][q]=2;
						sb.cost[i][0]--;
						sb.cost[0][q]--;
						sb.cost[0][0]--;
					}
				for(p=1;p<=sb.matrixsize;p++)
					if(sb.cost[p][j]==0&&sb.zeroelem[p][j]==0)
					{
						sb.zeroelem[p][j]=2;
						sb.cost[p][0]--;
						sb.cost[0][j]--;
						sb.cost[0][0]--;
					}

				k=sb.cost[0][0]+1;
				while(sb.cost[0][0]<k)
				{
					k=sb.cost[0][0];
					for(p=i+1;p<=sb.matrixsize;p++)
					{
						if(sb.cost[p][0]==1)
						{
							for(q=1;q<=sb.matrixsize;q++)
								if(sb.cost[p][q]==0&&sb.zeroelem[p][q]==0)
									break;
							sb.zeroelem[p][q]=1;
							sb.cost[p][0]--;
							sb.cost[0][q]--;
							sb.cost[0][0]--;
							for(m=1;m<=sb.matrixsize;m++)
								if(sb.cost[m][q]=0&&sb.zeroelem[m][q]==0)
								{
									sb.zeroelem[m][q]=2;
									sb.cost[m][0]--;
									sb.cost[0][q]--;
									sb.cost[0][0]--;
								}
						}//if
					}//for
					for(q=1;q<=sb.matrixsize;q++)
					{
						if(sb.cost[0][q]==1)
						{
							for(p=1;p<=sb.matrixsize;p++)
								if(sb.cost[p][q]==0&&sb.zeroelem[p][q]==0)
									break;
							sb.zeroelem[p][q]=1;
							sb.cost[p][q]--;
							sb.cost[0][q]--;
							sb.cost[0][0]--;
							for(n=1;n<=sb.matrixsize;n++)
								if(sb.cost[p][n]==0&&sb.zeroelem[p][n]==0)
								{
									sb.zeroelem[p][n]=2;
									sb.cost[p][0]--;
									sb.cost[0][n]--;
									sb.cost[0][0]--;
								}
						}//if
					}//for
				}//while
				if(sb.cost[0][0]>0)
					twozero(sb);
				else 
					judge(sb,result);
			}//if->p5	          
			sb=st;
		}//for->p5
	}//if->p5
}//twozero


void judge(matrix &sb,int result[501][2])
{
	int i,j;
	int m;
	int n;
	int k;
	m=0;
	for(i=1;i<=sb.matrixsize;i++)
		for(j=1;j<=sb.matrixsize;j++)
			if(sb.zeroelem[i][j]==1)
				m++;
	if(m==sb.matrixsize)
	{
		k=1;
		for(n=1;n<=result[0][0];n++)
		{
			for(i=1;i<=sb.matrixsize;i++)
			{
				for(j=1;j<=sb.matrixsize;j++)
					if(sb.zeroelem[i][j]==1)
						break;
				if(i<=sb.personnumber&&j<=sb.jobnumber)
					if(j!=result[k][1])
						break;
				k++;
			}
			if(i==sb.matrixsize+1)
				break;
			else
				k=n*sb.matrixsize+1;
		}
		if(n>result[0][0])
		{
			k=result[0][0]*sb.matrixsize+1;
			for(i=1;i<=sb.matrixsize;i++)
				for(j=1;j<=sb.matrixsize;j++)
					if(sb.zeroelem[i][j]==1)
					{
						result[k][0]=i;
						result[k++][1]=j;
					}
			result[0][0]++;
		}
	}
	else
	{
		refresh(sb);
	}
}//judge


void refresh(matrix &sb)
{
	int i,j;
	float k;
	int p;
	k=0;

	for(i=1;i<=sb.matrixsize;i++)
	{
		for(j=1;j<=sb.matrixsize;j++)
			if(sb.zeroelem[i][j]==1)
			{
				sb.zeroelem[i][0]=1;         //有獨立零元素
				break;
			}
	}
	while(k==0)
	{
		k=1;
		for(i=1;i<=sb.matrixsize;i++)
			if(sb.zeroelem[i][0]==0)
			{
				sb.zeroelem[i][0]=2;
				for(j=1;j<=sb.matrixsize;j++)
					if(sb.zeroelem[i][j]==2)
					{
						sb.zeroelem[0][j]=1;
					}
			}
		for(j=1;j<=sb.matrixsize;j++)
		{
			if(sb.zeroelem[0][j]==1)
			{
				sb.zeroelem[0][j]=2;
				for(i=1;i<=sb.matrixsize;i++)
					if(sb.zeroelem[i][j]==1)
					{
						sb.zeroelem[i][0]=0;
						k=0;
					}
			}
		}
	}                    //為2的行或者列是打"√"的
	p=0;
	k=0;
	for(i=1;i<=sb.matrixsize;i++)
	{
		if(sb.zeroelem[i][0]==2)
		{
			for(j=1;j<=sb.matrixsize;j++)
			{
				if(sb.zeroelem[0][j]!=2)
					if(p==0)
					{
						k=sb.cost[i][j];
						p=1;
					}
					else
					{
						if(sb.cost[i][j]<k)
							k=sb.cost[i][j];
					}
			}
		}
	}
	for(i=1;i<=sb.matrixsize;i++)
	{
		if(sb.zeroelem[i][0]==2)
			for(j=1;j<=sb.matrixsize;j++)
				sb.cost[i][j]=sb.cost[i][j]-k;
	}

	for(j=1;j<=sb.matrixsize;j++)
	{
		if(sb.zeroelem[0][j]==2)
			for(i=1;i<=sb.matrixsize;i++)
				sb.cost[i][j]=sb.cost[i][j]+k;
	}                                 //化簡矩陣
	for(i=0;i<=sb.matrixsize;i++)
		for(j=0;j<=sb.matrixsize;j++)
			sb.zeroelem[i][j]=0;              //清0
	circlezero(sb);	
}//refresh


void zeroout(matrix &sb)
{
	int i,j; 
	float k;
	for(i=1;i<=sb.matrixsize;i++)
	{
		k=sb.cost[i][1];
		for(j=2;j<=sb.matrixsize;j++)
			if(sb.cost[i][j]<k)
				k=sb.cost[i][j];
		for(j=1;j<=sb.matrixsize;j++)
			sb.cost[i][j]=sb.cost[i][j]-k;
	}
	for(j=1;j<=sb.matrixsize;j++)
	{
		k=sb.cost[1][j];
		for(i=2;i<=sb.matrixsize;i++)
			if(sb.cost[i][j]<k)
				k=sb.cost[i][j];
		for(i=1;i<=sb.matrixsize;i++)
			sb.cost[i][j]=sb.cost[i][j]-k;
	}
}//zeroout


void output(int result[501][2],matrix sb)
{
	int k;
	int i;
	int j;
	int p;
	char w;
	float v;

	v=0;
	for(i=1;i<=sb.matrixsize;i++)
	{
		v=v+sb.costforout[i][result[i][1]];
	}
	printf("最優(yōu)解的目標(biāo)函數(shù)值為%f.\n",v);

	k=result[0][0];
	if(k>5)
	{
		printf("解的個數(shù)超過了限制.\n");
		k=5;
	}
	for(i=1;i<=k;i++)
	{
		printf("按任意鍵輸出第%d種解.\n",i);
		scanf("%c",&w);
		p=(i-1)*sb.matrixsize+1;
		for(j=p;j<p+sb.matrixsize;j++)
			if(result[j][0]<=sb.personnumber&&result[j][1]<=sb.jobnumber)
				printf("第%d個人做第%d件工作.\n",result[j][0],result[j][1]);
		printf("\n");
	}
}//output


void main()
{
	result[0][0]=0;
	sb=input();
	zeroout(sb);
	circlezero(sb);
	output(result,sb);
}//main

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线91免费看| 日韩色视频在线观看| 日韩av一二三| 亚洲欧美日韩在线播放| 欧美肥妇毛茸茸| 婷婷六月综合网| 久久女同性恋中文字幕| 成人精品国产福利| 裸体在线国模精品偷拍| 国产精品久久久久7777按摩| 制服丝袜av成人在线看| 成人app网站| 久久精品99国产国产精| 亚洲女同女同女同女同女同69| 日韩视频免费直播| 91蜜桃在线观看| 国产乱子轮精品视频| 性感美女久久精品| 中文字幕日韩一区| 欧美精品一区二区在线播放| 欧美在线色视频| 成人免费电影视频| 韩国理伦片一区二区三区在线播放| 亚洲精品免费在线| 中文在线资源观看网站视频免费不卡| 666欧美在线视频| 色综合久久久网| 国产一区二区中文字幕| 亚洲黄网站在线观看| 国产午夜精品久久久久久免费视| 日韩一区二区免费电影| 欧美色图12p| 色噜噜狠狠色综合中国| 成人一区二区视频| 国产一区在线不卡| 久久成人久久鬼色| 天堂影院一区二区| 午夜亚洲国产au精品一区二区| 亚洲天堂成人网| 国产精品免费久久久久| 国产视频一区在线播放| 精品播放一区二区| 精品少妇一区二区三区日产乱码 | 国产精品影视网| 日韩av在线发布| 天天综合色天天综合色h| 亚洲一区免费观看| 亚洲一区二区欧美日韩| 亚洲一二三四在线观看| 国产精品国产三级国产aⅴ入口| 日本一区二区成人在线| 国产精品女同互慰在线看| 久久久精品免费免费| 精品国产一二三| 精品国产乱码久久久久久影片| 日韩欧美国产精品一区| 精品国偷自产国产一区| 欧美精品一区男女天堂| 欧美乱妇一区二区三区不卡视频| 色婷婷激情久久| 在线一区二区三区做爰视频网站| 色综合天天综合在线视频| 色狠狠色狠狠综合| 欧美日韩一区在线| 日韩免费电影一区| 久久综合成人精品亚洲另类欧美| 久久夜色精品国产噜噜av| 国产视频一区在线播放| 中文字幕不卡在线播放| 国产日韩高清在线| 26uuu久久天堂性欧美| 久久亚洲影视婷婷| 国产精品美女久久久久久| 18欧美乱大交hd1984| 午夜久久久久久| 韩国精品久久久| 成人动漫av在线| 欧美日韩一区小说| 欧美精品一区二区精品网| 国产女人18毛片水真多成人如厕| 亚洲欧洲日韩一区二区三区| 一区二区免费在线播放| 裸体一区二区三区| 从欧美一区二区三区| 91极品美女在线| 日韩欧美一区在线| 国产精品日韩精品欧美在线| 国产精品家庭影院| 午夜精品免费在线观看| 久久99精品久久久久婷婷| www.色综合.com| 日韩片之四级片| 国产精品久久久99| 免费视频一区二区| 国产999精品久久久久久| 欧美优质美女网站| 欧美成人激情免费网| 亚洲少妇屁股交4| 免费成人av在线| 91视视频在线直接观看在线看网页在线看| 欧美人伦禁忌dvd放荡欲情| 国产欧美日韩视频在线观看| 亚洲在线中文字幕| 国产黄色精品视频| 欧美美女喷水视频| 欧美tk—视频vk| 亚洲色图一区二区三区| 精品一区二区三区欧美| 91一区二区在线| 久久无码av三级| 亚洲成a人v欧美综合天堂| 成人性色生活片| 日韩一区二区三区精品视频| 亚洲精品日产精品乱码不卡| 国产一二三精品| 欧美一区二区视频在线观看2020 | 蜜臀91精品一区二区三区 | 国产精品网站在线观看| 亚洲图片有声小说| 成人妖精视频yjsp地址| 欧美电视剧在线观看完整版| 亚洲自拍偷拍欧美| 91亚洲精品久久久蜜桃网站| 2019国产精品| 免费久久99精品国产| 欧亚一区二区三区| 中文字幕av一区 二区| 日本午夜一本久久久综合| 色婷婷亚洲精品| 中文字幕日韩欧美一区二区三区| 国产一区二区在线免费观看| 日韩欧美电影一二三| 天堂久久一区二区三区| 欧美日韩三级一区二区| 亚洲图片你懂的| 99精品偷自拍| 中文字幕日韩一区| 成人午夜激情影院| 国产区在线观看成人精品| 国产在线观看免费一区| 日韩欧美另类在线| 图片区小说区国产精品视频| 91福利国产成人精品照片| 1000部国产精品成人观看| 国产福利电影一区二区三区| 国产日韩在线不卡| 国产99久久久国产精品免费看| 国产午夜三级一区二区三| 国产成人夜色高潮福利影视| 国产女人aaa级久久久级| 国产福利91精品| 国产精品久久午夜| 国产裸体歌舞团一区二区| 久久综合色之久久综合| 精品亚洲国内自在自线福利| 久久久精品免费观看| 97se亚洲国产综合自在线观| 亚洲国产美女搞黄色| 69堂成人精品免费视频| 国产精品99久| 亚洲精品成人悠悠色影视| 日韩一区二区三| 国产成人a级片| 亚洲一区二区三区四区的| 日韩视频免费观看高清完整版在线观看 | 久久久久久久久免费| 99综合电影在线视频| 亚洲国产精品一区二区久久| 日韩女优制服丝袜电影| 成人激情图片网| 日韩电影在线观看电影| 欧美韩国日本综合| 欧美日韩国产小视频在线观看| 国产麻豆视频一区| 亚洲第一在线综合网站| 久久久久成人黄色影片| 在线免费观看日本欧美| 久久99精品一区二区三区| 亚洲欧美日本在线| 亚洲精品一线二线三线| 欧美性大战久久| 国产成人av一区二区三区在线观看| 亚洲一区二区在线观看视频 | 久久99热国产| 亚洲综合在线电影| 久久久亚洲国产美女国产盗摄| 在线免费视频一区二区| 粉嫩av一区二区三区粉嫩| 亚洲成人综合视频| 中文字幕一区不卡| 精品蜜桃在线看| 欧美日韩国产综合一区二区三区| 国产乱码精品一区二区三区忘忧草| 亚洲一区二区在线观看视频| 国产日韩精品一区二区三区| 欧美一卡二卡三卡四卡| 欧美三级视频在线播放| av成人老司机| 国产老女人精品毛片久久| 秋霞午夜鲁丝一区二区老狼|