遇到這種利益衝突的最終利益最大化問題
考慮轉化為最小割,使得損失的價值最小
相當於文科是s,理科是t,選出最小割就是確定損失代價最小的方案
然後就把s向每個點連一條cap=art[i][j]的邊,每個點向t連一條cap=science[i][j]的邊,再新建n*m個點表示同選文科的利益,然後s向每個新建點連一條cap=same_art[i][j]的邊,然後再從新建點向每個點和它的相鄰點向連一條cap=inf的邊,然後同選立刻的收益同理新建點再向t連邊,相鄰點同理的向新建點連邊
再跑出最小割即可
#include #include #include #include #include using namespace std;
struct edge;
const int maxn = 40100;
const int inf = 0x3f3f3f3f;
vectoredges;
vectorg[maxn];
void addedge(int u,int v,int cap));
edges.push_back((edge));
int cnt=edges.size();
g[u].push_back(cnt-2);
g[v].push_back(cnt-1);
}int cur[maxn],dep[maxn],vis[maxn],s,t;
int dfs(int x,int a)
}return flow;
}queueq;
bool bfs(void)}}
return vis[t];
}int dinic(void)
return flow;
}int n,m,same_wen[110][110],same_li[110][110],wen[110][110],li[110][110],sum=0;
const int mx = ,my =;
int id(int x,int y,int idx=0)
int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
// printf("not re\n");
s=maxn-2;//wen
t=maxn-3;//li
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)//shang
for(int j=1;j<=m;j++)
// printf("not re\n");
printf("%d\n",sum-dinic());
return 0;
}
P4313 文理分科 最小割
有n m n mn m個人,第 i,j i,j i,j 選擇文科就可以獲得art i,jart arti,j 的價值,選擇理科就可以獲得sci i,jsci scii,j 的價值。如果乙個選擇文科的人周圍都選擇了文科,那麼就可以多獲得sam e ar ti,j same art same a rti...
P4313 文理分科 最小割
在說這道題之前,讓我們先思考一下最小割的性質.最小割就是使得s到t不同割掉的最小邊的容量,割過之後,所有的點要麼與s聯通,要麼與t聯通.這樣的性質,即要麼與s有關係,要麼與t有關係的性質 非黑即白 就是典型的最小割的題目.而這道題就顯然,乙個人要麼選文,要麼選理,沒其他的選擇了.所以我們鎖定最小割....
網路流 洛谷 4313 文理分科
顯然是網路流,答案為正邊權和減去最小割 但怎麼建圖,首先源點與匯點分別連自身文理滿意值 考慮文理都必須拆點,文科先和源點連一條邊,再與相鄰連inf 理科先和匯點連一條邊,再與相鄰連inf 這樣文科理科二者不可得兼,最大流 最小割,那麼就可以用網路流求 include include include ...