Bzoj1449 JSOI2009 球隊收益

2022-05-13 16:35:54 字數 1371 閱讀 9587

time limit: 5 sec  memory limit: 64 mb

submit: 741  solved: 423

乙個整數表示聯盟裡所有球隊收益之和的最小值。

3 31 0 2 1

1 1 10 1

0 1 3 3

1 22 3

3 143

最小費用最大流。

比賽無論勝負都會給球隊帶來收益,使得建邊極為困難。考慮轉化問題,首先假設每場比賽的結果是「兩方都輸」,以此為初始狀態,之後決策某個隊伍勝利,則獲得的收益為「贏的收益-輸的收益」。

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

using

namespace

std;

8const

int inf=1e8;

9const

int mxn=9000;10

intread()

13while(ch>='

0' && ch<='9')

14return x*f;15}

16struct

edgee[mxn<<1

];20

int hd[mxn],mct=1;//

21void add_edge(int u,int v,int c,int

w)24

//25

intn,m;

26int

s,t;

27int ans=0;28

intwin[mxn],lose[mxn],c[mxn],d[mxn];

29//

30int

dis[mxn];

31bool

inq[mxn];

32int pre[mxn<<1

];33

void spfa(int

s)52}53

}54}55

return;56

}57void maxflow(int s,int

t)68

spfa(s);69}

70return;71

}72inta[mxn],b[mxn];

73int

main()

7481

for(i=1;i<=m;i++)

85for(i=1;i<=n;i++)

89 s=0;t=m+n+2;90

for(i=1;i<=m;i++)

108maxflow(s,t);

109 printf("

%d\n

",ans);

110return0;

111 }

JSOI2009 bzoj1449 球隊收益

description input output 乙個整數表示聯盟裡所有球隊收益之和的最小值。首先假設全輸,然後給每場比賽分配乙個贏家,每個隊伍每多贏一場多獲得的收益作為費用。但是有乙個問題,如何保證每次走的是對應的邊?也就是,如何保證贏第一場的時候增加的收益是贏一場減贏零場,而不是贏兩場減贏一場?...

bzoj1449 JSOI2009 球隊收益

傳送門 感覺就是費用流呀。可以發現這道題與之前的費用流題有所不同,因為乙個球隊不論輸還是贏都會獲得收益。這裡就要用到乙個技巧,我們可以假裝比賽雙方都輸,然後修改贏的就ok辣。然後就是每個人向終點連邊,這裡的費用隨著流量的變化而變化,所以我們要用到拆邊法。考慮乙個人從贏win i 次 輸lose i ...

BZOJ1449 JSOI2009 球隊收益

bzoj luogu 在乙個籃球聯賽裡,有 n 支球隊,球隊的支出是和他們的勝負場次有關係的,具體來說,第i支球隊的賽季總支出是 c i times x 2 d i times y 2,d i le c i 其中 x,y 分別表示這只球隊本賽季的勝負場次。現在賽季進行到了一半,每只球隊分別取得了 a...