P2057 [SHOI2007]善意的投票 / [JLOI2010]冠軍調查( 最小割 )
題目連結:點選進入
題意
n個人都有自己的意見(總共兩種),n個人中有m對朋友,為了朋友,他們也可以投和自己本來意願相反的票。一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。應該怎樣投票,才能使衝突數最小?
思路
兩種意見可以看作源點 S 和匯點 T 所代表的兩個集合,我們的目的是割最少的邊使得 S 和 T 成為兩個無交集的集合(因為若 S 和 T 連通,則必然存在一條路徑,這樣肯定會有衝突,所以需要使 S 和 T 孤立)。
例:
假設 S -> A -> B -> T,S -> A 表示 A 本意是集合 S ,B -> T 表示B本意是集合 T ,A -> B 表示 A 要求 B 與它同立場,反之 B -> A 表示,B 要求 A 與它同立場 ;
如果切斷 S -> A 這條邊,表示點 A 選擇了集合 T,衝突加一 ;
如果切斷 B -> T 這條邊,表示點 B 選擇了集合 S,衝突加一 ;
如果切斷 A -> B 這條邊,表示 A 與 B 的立場不同,衝突加一;
最後求得的最小割就是衝突的最小值。( 割掉一條邊相當於一次衝突,因為若某邊被割走,則顯然這條邊相連的兩個點分別通向了集合 S 和集合 T ,所以算是一次衝突 )
整體建圖:
源點->同意的人->不同意的人->匯點
具體建圖:
1)同意睡覺的人與源點 S 建邊
2)不同意睡覺的人與匯點 T 建邊
3)好朋友之間雙向建邊 ( 例:A 與 B的朋友關係是相對的,A 要求 B 與它同立場,那麼 B 肯定也要求 A 與它同立場,所以好朋友 A 和 B 之間應該建立雙向邊)
根據最大流最小割定理 最小割等於最大流
所以,建完圖後跑一邊最大流就歐克
程式碼
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
struct node
{
int to;
int next;
ll val;
}edge[maxn];
int head[maxn],tot;
void add(int u,int v,int val)
{
edge[tot].to=v;
edge[tot].val=val;
edge[tot].next=head[u];
head[u]=tot++;
edge[tot].to=u;
edge[tot].val=0;
edge[tot].next=head[v];
head[v]=tot++;
}
int deep[maxn];
int cur[maxn];
int n,m,p,q,x,y;
ll res;
int s;
int t;
int dfs(int pos,int flow)
{
if(pos==t) return flow;
int rest=flow,k,i;
for(i=cur[pos];i!=-1&&rest;i=edge[i].next)
{
int v=edge[i].to;
int val=edge[i].val;
if(deep[v]==deep[pos]+1&&val)
{
k=dfs(v,min(val,rest));
if(!k) deep[v]=0;
edge[i].val-=k;
edge[i^1].val+=k;
rest-=k;
}
}
cur[pos]=i;
return flow-rest;
}
bool bfs()
{
memset(deep,0,sizeof(deep));
deep[s]=1;
queue<int>q;
q.push(s);
cur[s]=head[s];
while(q.size())
{
int now=q.front();
q.pop();
for(int i=head[now];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].val&&!deep[v])
{
q.push(v);
cur[v]=head[v];
deep[v]=deep[now]+1;
if(v==t) return 1;
}
}
}
return 0;
}
void dinic()
{
while(bfs())
res+=dfs(s,0x3f3f3f3f);
}
int main()
{
ios::sync_with_stdio(false);
memset(head,-1,sizeof(head));
cin>>n>>m;
s=n+1,t=n+2;
for(int i=1;i<=n;i++)
{
cin>>x;
if(x==1)
add(s,i,1);
else
add(i,t,1);
}
for(int i=1;i<=m;i++)
{
cin>>x>>y;
add(x,y,1);
add(y,x,1);
}
dinic();
printf("%lld\n",res);
return 0;
}
相關文章
- 最大流最小割
- 網路流-最小割
- bzoj4808: 馬(最小割)
- bzoj3275: Number(最小割)
- 網路流(最大流,最小割)
- 大語言模型微調資料競賽,冠-軍!模型
- 偷寶石(最大流轉化最小割)
- bzoj1391: [Ceoi2008]order(最小割)
- 2024 SemEval 冠軍
- 1.1.3.3 最小割之最小權覆蓋集、最大權獨立集
- SPOJ - OPTM Optimal Marks(進位制拆分+最小割)
- 網路流最大流、最小割學習筆記筆記
- NewsCred:冠狀病毒對營銷團隊的影響調查
- 成為奧運冠軍很難,成為女奧運冠軍更難。
- bzoj3175: [Tjoi2013]攻擊裝置(最小割)
- Facebook Gaming調查了新冠疫情對工作產生的影響GAM
- 移動電競賽湖南總決賽冠軍專訪:電競湘軍劍指全國冠軍!
- 提前預測世界盃冠軍
- 論文導讀 | 最小屬性割RDF資料劃分
- 【BZOJ-1565】植物大戰殭屍 拓撲排序 + 最小割排序
- 香檳中的冠軍,你猜到了嗎?
- 浩華管理:香港酒店新冠疫情影響調查報告
- [SHOI2007]書櫃的尺寸 題解
- Michael Page:新冠疫情下中國職場信心調查報告
- 反彈預期強勁:新冠肺炎疫情消費者調查
- EDG奪得2024無畏契約全球冠軍賽總冠軍,CN賽區閃耀世界賽場
- 斬獲魯棒性閱讀大賽兩項冠軍,ICDAR 2019冠軍解決方案將開源
- 我們是冠軍!2019部落衝突全球錦標賽,中國部落斬獲總冠軍
- 北京市隱形冠軍企業聯合調研工作組領導蒞臨綠盟科技調研指導
- MRI-Simmons:冠狀病毒流行期間消費者調查報告
- comScore:新冠病毒期間歐洲五國網路行為調查
- 益普索:新冠一年來全球機構應對調查
- CCL 2024 Task7 雙任務冠軍
- ImageNet歷年冠軍和相關CNN模型CNN模型
- 2024全球冠軍賽:你需要知道的一切
- 奪冠!卓世AI斬獲全球頂會AAMAS 2024 CE 競賽冠軍AI
- 五個Java冠軍喜歡的Java 16強大功能 - oracleJavaOracle
- xView2 比賽冠軍程式碼解讀View