題意:
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 #include8using
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。對這個圖求出...