hdu3081 二分 並查集 最大流

2021-07-11 14:03:21 字數 1427 閱讀 2789

題意:

有n個女孩,n個男孩,對於每個女孩有幾個沒有爭吵過的男孩,每個女孩有幾個朋友(都是女孩),對於沒有爭吵過的男孩可以建立關係。這樣就可以進行一次遊戲,那麼下一次可以選擇乙個之前沒有選擇過的人建立關係。那麼求最多能進行多少次關係。

思路:

對於朋友關係,很容易想到用並查集維護,那麼在乙個集合中所連的邊都是一樣的。二分答案,判斷mid輪的可行性。將源點連到每個女孩,容量為mid。將女孩連到相應的男孩上,容量為1。將每個男孩連到匯點,容量為mid。如果mid輪能滿足的話,那麼提高下限,不行就縮小上限。

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int m_node = 400,m_edge = 20009000, inf = 0x3f3f3f3f;

typedef pair pii;

struct edge

edge[m_edge];

bool mp[m_node][m_node];

pii in[20009];

int p[m_node];

int head[m_node],level[m_node];

int n,m,f,num,numuni;

int s,t;

void init()

//memset(mp,false,sizeof(mp));

//numuni = 1;

}void add_edge(int u,int v,int cap)

int find(int x)

void uni(int x,int y)

}void build(int mid)

for(int i = 0;i < m;i++)}}

}bool bfs(int s,int t)}}

if(level[t] != -1) return

true;

return

false;

}int dfs(int v,int t,int f)}}

level[v] = -1; //優化

return0;}

int dinic(int s,int t)

return flow;

}int main()

for(int i = 0;i < f;i++)

s = 0;

t = 2*n + 1;

int l = -1, r = n+1;

while(r - l > 1)

printf("%d\n",l);

}return

0;}

hdu 3277 二分 並查 最大流

題意 和3081差不多 只是多了乙個條件,每個女生可以選最多k個不喜歡的男生匹配 思路 將每個女孩u分為u1,u2,若u喜歡v則加一條u1到v的邊 容量為1 否則加一條u2到v的邊,容量為1 令加u1到u2的容量為k的邊 其他同3081一樣 源點到每個女生連容量為x的邊,男生到匯點連容量為x的邊,x...

hdu 3228 最大流 二分

題意 一共有n個城市,一些城市裡有金礦,一些城市裡有倉庫,金礦和倉庫都有乙個容量,有m條邊,每條邊是雙向的,有乙個權值,求將所有金礦裡的儲量都運送到倉庫中,所需要經過的道路中,使最大的權值最小 思路 增設乙個超級源點和乙個超級匯點,源點與每乙個城市相連,容量為 數量,匯點與倉庫相連,容量為倉庫的容量...

HDU1598 並查集 或 二分 DFS

題意 求從s到t的所有路線中最大邊權與最小邊權差值的最小值。方法一 並查集 貪心 將邊按照邊權從小到大排序,然後依次選取邊作為從s到t路線的最小邊,然後再按照邊權從小到大不斷加邊,直到s t聯通,則最後加的邊的邊權與最小邊權的差是答案的乙個可能解。對最小邊依次列舉,答案為所有可能解的最小值。incl...