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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu 1853(Cyclic Tour)

發布時間:2025/6/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1853(Cyclic Tour) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1853

二分匹配,求最小權,只要一開始先取相反數,lx初始化的時候取無窮小。。。然后KM一敲,最后輸出在取相反數就行了。。。

值得一提的是,我這種渣代碼,竟然跑了個rank 1。。。orz。。。

View Code 1 #include<iostream> 2 const int MAXN=110; 3 const int inf=1<<30; 4 using namespace std; 5 int n,m; 6 int map[MAXN][MAXN]; 7 int lx[MAXN],ly[MAXN]; 8 int match[MAXN]; 9 bool visitx[MAXN],visity[MAXN]; 10 11 //匈牙利算法 12 int Hungary(int u){ 13 visitx[u]=true; 14 for(int i=1;i<=n;i++){ 15 if(!visity[i]&&lx[u]+ly[i]==map[u][i]){ 16 visity[i]=true; 17 if(match[i]==-1||Hungary(match[i])){ 18 match[i]=u; 19 return true ; 20 } 21 } 22 } 23 return false ; 24 } 25 26 void KM_prefect_match(){ 27 int tmp; 28 for(int i=1;i<=n;i++){ 29 lx[i]=-inf; 30 } 31 memset(ly,0,sizeof(ly)); 32 for(int i=1;i<=n;i++){ 33 for(int j=1;j<=n;j++){ 34 lx[i]=max(lx[i],map[i][j]); 35 } 36 } 37 for(int i=1;i<=n;i++) 38 { 39 while(1){ 40 memset(visitx,false,sizeof(visitx)); 41 memset(visity,false,sizeof(visity)); 42 if(Hungary(i)) 43 break; 44 else { 45 tmp=inf; 46 for(int j=1;j<=n;j++)if(visitx[j]){ 47 for(int k=1;k<=n;k++){ 48 if(!visity[k]&&tmp>lx[j]+ly[k]-map[j][k]){ 49 tmp=lx[j]+ly[k]-map[j][k]; 50 } 51 } 52 } 53 for(int j=1;j<=n;j++){ 54 if(visitx[j]) 55 lx[j]-=tmp; 56 if(visity[j]) 57 ly[j]+=tmp; 58 } 59 } 60 } 61 } 62 } 63 64 int main(){ 65 while(~scanf("%d%d",&n,&m)){ 66 memset(match,-1,sizeof(match)); 67 for(int i=1;i<=n;i++){ 68 for(int j=1;j<=n;j++){ 69 map[i][j]=-inf; 70 } 71 } 72 for(int i=1;i<=m;i++){ 73 int x,y,w; 74 scanf("%d%d%d",&x,&y,&w); 75 if(map[x][y]<-w){ 76 map[x][y]=-w; 77 } 78 } 79 KM_prefect_match(); 80 int flag=false; 81 int ans=0; 82 for(int i=1;i<=n;i++){ 83 if(match[i]==-1||map[match[i]][i]==-inf){ 84 flag=true; 85 break; 86 } 87 ans+=map[match[i]][i]; 88 } 89 if(flag){ 90 printf("-1\n"); 91 }else 92 printf("%d\n",-ans); 93 } 94 return 0; 95 }

?

?

轉載于:https://www.cnblogs.com/wally/archive/2013/04/02/2996537.html

總結

以上是生活随笔為你收集整理的hdu 1853(Cyclic Tour)的全部內容,希望文章能夠幫你解決所遇到的問題。

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