hdu 4560 拆點最大流

2022-06-02 12:57:12 字數 2392 閱讀 6321

題意:

2023年一開始,一檔**節目「我是歌手」就驚豔了大家一回。閒話少說,現在,你成為了這檔節目的總導演,你的任務很簡單,安排每一期節目的內容。

現在有n個歌手,m種歌曲流派(rock,pop之類),每個歌手都有自己擅長的流派領域,這些資料都已整理好。你的工作是,安排盡可能多場的演唱比賽。每

一場比賽所有歌手都必須上場,為了提高收視率,每個人演唱的歌曲型別不能相同,即便一些歌手要被迫選擇一些他們不擅長的。同時,為了展現全面性,在不同的

演唱比賽上,每個歌手都會安排不同的歌曲流派。

但是問題是,對於任何乙個歌曲流派的歌迷,如果超過k個不擅長的歌手演唱了這種歌曲,他們就會表示不滿,比如,發一些宣洩不滿的帖子微博,為了表示觀點挑起事端等等。你當然不希望這些事情與你的節目有關,在這個前提下,你可以任意安排盡可能多的比賽場次。

online_judge寫錯了,wa了好多發

n個歌手編號為1~n

m種歌曲,拆點。編號分別為n+1~n+m,n+m+1~n+2*m

源點為0,匯點為n+2*m+1  總共n+2*m+2個點。

n+i 和  n+m+i  之間連權值為k的邊,作為限制。

對於i, j  如果i對j擅長,那麼連邊 i -> n+m+j

否則連邊 i -> n+j 這樣就可以限制了。

然後是二分答案。

0~(1~n)之間,連邊 mid .

(n+m+1~n+2*m)與n+2*m+1之間也連邊mid

然後判斷mid*n和最大流是不是相當。

然後就是最大流模板題了。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10#define pb(a) push_back(a)

11const

int inf=0x3f3f3f3f;12

const

double eps=1e-5

;13 typedef long

long

ll;14

#define cl(a) memset(a,0,sizeof(a))

15#define ts printf("*****\n");

16const

int maxn=1010;17

intn,m,tt,cnt;

18int

maze[maxn][maxn];

19int

gap[maxn],dis[maxn],pre[maxn],cur[maxn];

20int flow[maxn][maxn];//

存最大流的容量

21int sap(int start,int end,int

nodenum)

2246 aug=-1;47

}48goto

loop;49}

50int mindis=nodenum-1;51

for(int v=0;v)

52if(maze[u][v]-flow[u][v]&&mindis>dis[v])

5357

if((--gap[dis[u]])==0)break

;58 gap[dis[u]=mindis+1]++;

59 u=pre[u];60}

61return

maxflow;62}

63bool check(int

mid)

6469

for(int i=n+m+1;i<=n+2*m;i++)maze[i][n+2*m+1]=mid;

70if(sap(0,n+2*m+1,n+2*m+2)==mid*n) return1;

71else

72return0;

73}74int

used[maxn][maxn];

75int

main()

7695

96for(i=n+1;i<=n+m;i++)maze[i][i+m]=k;

97for(int i=1;i<=n;i++)

98for(int j=1;j<=m;j++)

99104

else maze[i][j+n]=1

;105

}106

int l=0,r=m;

107int ans=0

;108

while(l<=r)

109116

else r=mid-1

;117

}118 printf("

case %d: %d\n

",ca++,ans);

119}

120 }

hdu 4292 拆點 最大流)

思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...

hdu 4292 拆點 最大流)

思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...

hdu 4289 最大流拆點

大致題意 給出乙個又n個點,m條邊組成的無向圖。給出兩個點s,t。對於圖中的每個點,去掉這個點都需要一定的花費。求至少多少花費才能使得s和t之間不連通。大致思路 最基礎的拆點最大流,把每個點拆作兩個點 i 和 i 連線i i 費用為去掉這個點的花費,如果原圖中有一條邊a b則連線a b。對這個圖求出...