poj 3565 uva 1411 Ants KM算法求最小权
生活随笔
收集整理的這篇文章主要介紹了
poj 3565 uva 1411 Ants KM算法求最小权
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? 由于涉及到實數(shù),一定,一定不能直接等于,一定,一定加一個誤差<0.00001,坑死了……
??有兩種事物,不難想到用二分圖。這里涉及到一個有趣的問題,這個二分圖的完美匹配的最小權(quán)值和就是答案。為啥呢?因為如果有四個點,a,b,c,d?。Ab和cd交叉,ac和bd不交叉,那么ac和bd的長度和一定小于ab和cd的長度和,可以畫一個圖很容易就證出來。所以,如果所有的邊都不交叉,又因為有解,那么最小的權(quán)值和就是解了。附圖一枚,自己畫的,比較簡陋,湊活著看吧……
??用KM算法求最佳完美匹配最小權(quán)值和,可以直接把所有的權(quán)值轉(zhuǎn)成負值,在求最大權(quán)值和,但是這種方法我覺得有些不對勁,但是不知道在哪里=?=,上網(wǎng)一查,才發(fā)現(xiàn)這種方法只能用于x和y數(shù)量相同的時候,正統(tǒng)做法應該是用一個很大的數(shù)減去每個權(quán)值,再求最大權(quán)值和。PS:我用的是取反的方法……
?
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #define N 110 struct sss {int x,y; }white[N],black[N]; int n,vx[N],vy[N],fa[N]; double w[N][N],px[N],py[N],str[N]; double dis(int i,int j) {return sqrt((double)(black[i].x-white[j].x)*(black[i].x-white[j].x)+(double)(black[i].y-white[j].y)*(black[i].y-white[j].y)); } int find(int now) {int i,j,k;if (now==0)return 1;vx[now]=1;for (i=1;i<=n;i++){if (!vy[i]&&fabs(px[now]+py[i]-w[now][i])<0.00001){vy[i]=1;if (fa[i]==0||find(fa[i])){fa[i]=now;return 1;}}elseif (str[i]>px[now]+py[i]-w[now][i])str[i]=px[now]+py[i]-w[now][i];}return 0; } void KM() {int i,j,k,x,y,z;double na;memset(fa,0,sizeof(fa));for (i=1;i<=n;i++){memset(str,0x7f,sizeof(str));while (1){memset(vx,0,sizeof(vx));memset(vy,0,sizeof(vy));if (find(i))break;na=0x7f;for (j=1;j<=n;j++)if (!vy[j]&&na>str[j])na=str[j];for (j=1;j<=n;j++){if (vx[j])px[j]-=na;if (vy[j])py[j]+=na;elsestr[j]-=na;}}} } int main() {int i,j,k,x,y,z;z=0;while(scanf("%d",&n)!=EOF){if (z)printf("\n");elsez=1;for (i=1;i<=n;i++)px[i]=-100000;memset(py,0,sizeof(py));for (i=1;i<=n;i++)scanf("%d%d",&white[i].x,&white[i].y);for (i=1;i<=n;i++)scanf("%d%d",&black[i].x,&black[i].y);for (i=1;i<=n;i++)for (j=1;j<=n;j++) {w[i][j]=-dis(i,j);if (px[i]<w[i][j])px[i]=w[i][j];}KM();for (i=1;i<=n;i++)printf("%d\n",fa[i]);} }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/handsomeJian/p/3575536.html
總結(jié)
以上是生活随笔為你收集整理的poj 3565 uva 1411 Ants KM算法求最小权的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL学习笔记_9_MySQL高级操
- 下一篇: myeclipse2014新感悟