日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 3565 uva 1411 Ants KM算法求最小权

發(fā)布時間:2025/7/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 3565 uva 1411 Ants KM算法求最小权 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 由于涉及到實數(shù),一定,一定不能直接等于,一定,一定加一個誤差<0.00001,坑死了……

??有兩種事物,不難想到用二分圖。這里涉及到一個有趣的問題,這個二分圖的完美匹配的最小權值和就是答案。為啥呢?因為如果有四個點,a,b,c,d?Abcd交叉,acbd不交叉,那么acbd的長度和一定小于abcd的長度和,可以畫一個圖很容易就證出來。所以,如果所有的邊都不交叉,又因為有解,那么最小的權值和就是解了。附圖一枚,自己畫的,比較簡陋,湊活著看吧……

??KM算法求最佳完美匹配最小權值和,可以直接把所有的權值轉成負值,在求最大權值和,但是這種方法我覺得有些不對勁,但是不知道在哪里=?=,上網(wǎng)一查,才發(fā)現(xiàn)這種方法只能用于xy數(shù)量相同的時候,正統(tǒng)做法應該是用一個很大的數(shù)減去每個權值,再求最大權值和。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]);} }

?

?

轉載于:https://www.cnblogs.com/handsomeJian/p/3575536.html

總結

以上是生活随笔為你收集整理的poj 3565 uva 1411 Ants KM算法求最小权的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。