P4313 文理分科

2022-05-01 21:12:13 字數 1507 閱讀 8396

遇到這種利益衝突的最終利益最大化問題

考慮轉化為最小割,使得損失的價值最小

相當於文科是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 ...