題意:
有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...