多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > hdu 1569 方格取數(shù)(2) 網(wǎng)絡(luò)流 最大點(diǎn)權(quán)獨(dú)立集

hdu 1569 方格取數(shù)(2) 網(wǎng)絡(luò)流 最大點(diǎn)權(quán)獨(dú)立集

來源:程序員人生   發(fā)布時(shí)間:2015-06-06 08:38:24 閱讀次數(shù):2666次

方格取數(shù)(2)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5146    Accepted Submission(s): 1610


Problem Description
給你1個(gè)m*n的格子的棋盤,每一個(gè)格子里面有1個(gè)非負(fù)數(shù)。
從中取出若干個(gè)數(shù),使得任意的兩個(gè)數(shù)所在的格子沒有公共邊,就是說所取數(shù)所在的2個(gè)格子不能相鄰,并且取出的數(shù)的和最大。
 

Input
包括多個(gè)測試實(shí)例,每一個(gè)測試實(shí)例包括2整數(shù)m,n和m*n個(gè)非負(fù)數(shù)(m<=50,n<=50)
 

Output
對每一個(gè)測試實(shí)例,輸出可能獲得的最大的和
 

Sample Input
3 3 75 15 21 75 15 28 34 70 5
 

Sample Output
188
 

Author
ailyanlu


 

鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1569


做法:由于相鄰的點(diǎn)是不能同時(shí)取的,所以用i+j的奇偶可以分成兩類點(diǎn)。然后把相鄰的兩個(gè)點(diǎn)連上邊。我們要求的就是取若干個(gè)點(diǎn),且取走的點(diǎn)兩兩之間沒有邊,求出其最大的點(diǎn)權(quán)和。這個(gè)就是求最大點(diǎn)權(quán)獨(dú)立集。  有公式:最大點(diǎn)權(quán)獨(dú)立集=sum-最小點(diǎn)全覆蓋集。

最小點(diǎn)權(quán)覆蓋集,就是取若干個(gè)點(diǎn),這些點(diǎn)覆蓋到了所有的邊,且所有點(diǎn)的點(diǎn)權(quán)和是最小的。

由此可以建邊, ss 連向所有(i+j)%2==1的點(diǎn),邊權(quán)為這個(gè)點(diǎn)的值。   然后將他連向所有相鄰的點(diǎn),邊權(quán)為inf。然后把(i+j)%2==0的點(diǎn)連向ee,邊權(quán)為這個(gè)點(diǎn)的值。


然后跑出來的就是 最小點(diǎn)全覆蓋集 了。 想的話,把最大流 看成最小割,感覺可以想通點(diǎn),但是不知道怎樣說。 

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> const int MAXN = 22222;//點(diǎn)數(shù)的最大值 const int MAXM = 22222;//邊數(shù)的最大值 const int INF = 2000000000; struct Edge { int to,next,cap,flow; }edge[MAXM];//注意是MAXM int tol; int head[MAXN]; int gap[MAXN],dep[MAXN],cur[MAXN]; void init() { tol = 0; memset(head,⑴,sizeof (head)); } void addedge (int u,int v,int w,int rw = 0)//網(wǎng)絡(luò)流要有反向弧 { edge[tol].to = v; edge[tol].cap = w; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++; } int Q[MAXN]; void BFS(int start,int end) { memset(dep,⑴,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0] = 1; int front = 0, rear = 0; dep[end] = 0; Q[rear++] = end; while(front != rear) { int u = Q[front++]; for(int i = head[u]; i != ⑴; i = edge[i].next) { int v = edge[i]. to; if(dep[v] != ⑴)continue; Q[rear++] = v; dep[v] = dep[u] + 1; gap[dep[v]]++; } } } int S[MAXN]; int sap(int start,int end, int N)//有幾個(gè)點(diǎn) { BFS(start,end); memcpy(cur,head,sizeof(head)); int top = 0; int u = start; int ans = 0; int i; while(dep[start] < N) { if(u == end) { int Min = INF; int inser; for( i = 0;i < top;i++) { if(Min > edge[S[i]].cap - edge[S[i]].flow) { Min = edge[S[i]].cap - edge[S[i]].flow; inser = i; } } for( i = 0;i < top;i++) { edge[S[i]]. flow += Min; edge[S[i]^1].flow -= Min; } ans += Min; top = inser; u = edge[S[top]^1].to; continue; } bool flag = false; int v; for( i = cur[u]; i != ⑴; i = edge[i]. next) { v = edge[i]. to; if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]) { flag = true; cur[u] = i; break; } } if(flag) { S[top++] = cur[u]; u = v; continue; } int Min = N; for( i = head[u]; i != ⑴; i = edge[i].next) { if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } } gap[dep[u]]--; if(!gap[dep[u]]) return ans; dep[u] = Min + 1; gap[dep[u]]++; if(u != start)u = edge[S[--top]^1].to; } return ans; } int mp[60][60]; int main() { int n,m,a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { init(); int sum=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&mp[i][j]); sum+=mp[i][j]; } } int ss=n*m; int ee=n*m+1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { int nw=i*m+j; if((i+j)%2==1) { addedge(ss,nw,mp[i][j]); if(i!=0) addedge(nw,nw-m,INF); if(j!=0) addedge(nw,nw⑴,INF); if(i!=n⑴) addedge(nw,nw+m,INF); if(j!=m⑴) addedge(nw,nw+1,INF); } else addedge(nw,ee,mp[i][j]); } } printf("%d ",sum-sap(ss,ee,ee+1)); } return 0; } /* 3 3 9999 15 21 75 15 28 34 70 5 */










生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 波多野结衣50连精喷在线 | 日本护士高清xxxxx | 精品国产福利在线观看网址2022 | 精品一区二区久久久久久久网站 | 日韩欧美亚洲 | 亚洲天堂视频在线观看免费 | 国产亚洲欧美日韩俺去了 | 日韩美女影院 | 大片刺激免费播放视频 | 99精品亚洲 | 黑人和黑人激情一级毛片 | wwwxx欧美 | 一级毛片高清大全免费观看 | 精品福利一区二区三区免费视频 | 校园 图片区 视频 小说专区 | ww在线观视频免费观看w | 日韩欧美~中文字幕 | 亚洲综合一区二区精品久久 | 国产亚洲精品久久 | 男女激情视频 | 国产欧美成人不卡视频 | 国产一区二区久久精品 | 亚洲精品高清在线观看 | 亚洲精品国产综合久久一线 | 黑粗硬大欧美视频 | 国产精品一区二区三 | 激情免费视频 | 亚洲欧美视频一区二区三区 | 欧美在线视频观看 | 性www| 能看毛片的网址 | www.毛片| 午夜欧美 | japanese日本护士18 | 欧美一级高清在线观看 | 欧美超清性videosfree | 久久99精品久久久久久三级 | xxxx性xxxx| 沈樵在线观看福利 | 欧美成人免费网在线观看 | 久草视频播放 |