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 #include7using
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...