Luogu P4249 WC2007 剪刀石頭布

2022-03-25 18:51:09 字數 907 閱讀 7716

link

先把題意抽象一下:給定乙個存在一部分為定向的邊的競賽圖,最大化它的三元環個數。

我們知道競賽圖的三元環個數為\(-\sum\limits_^n\)。

對於一條未定向的邊\((u,v)\),它會使\(u,v\)其中乙個點的度數加一。

對於乙個點而言,隨著度數的增加,度數加一使得三元環減少的個數也是在增加的,也就是說這是乙個凸函式。

那麼直接費用流就行了,建圖就是凸函式差分的那一套方法。

#include#include#include#include#includeconst int n=107,v=6007,e=50007,inf=1e9;

int read()

int s,t,tot=1,a[n][n],deg[n],head[v],ver[e],next[e],edge[e],cost[e],dis[v],flow[v],inq[v],id[v];std::queueq;struct nodep[n*n];

void add(int u,int v,int f,int c)

int spfa()

int ek()

int main()

; for(int i=1;i<=n;++i) for(int j=deg[i];jfor(int i=1;i<=n;++i) ans-=deg[i]*(deg[i]-1)/2;

printf("%d\n",ans-ek());

for(int i=n+1;i<=cnt;++i) a[p[i].v][p[i].u]=!(a[p[i].u][p[i].v]=edge[p[i].id]);

for(int i=1;i<=n;++i,puts("")) for(int j=1;j<=n;++j) printf("%d ",a[i][j]);

}

Wc2007 剪刀石頭布

題目描述 bzluogu 題解 最小費用流。對於三支隊伍,勝負情況只有 2 種。一種是形成三元環,另一種是 x 贏兩場,y 贏一場,z 沒贏過。所以我們統計一下另一種最少有多少種就好了。最後答案就是 c 3 n k 對於乙個隊伍 x 若其勝場數為 w x 則會造成的負貢獻為 c 2 不會搞?作差啊。...

WC2007 剪刀石頭布

正著求不太好求,但是不是剪刀石頭布的又很好表示 三個人中恰好有乙個人贏了兩場。所以我們考慮讓這種三元組數量最少使得剪刀石頭布最多。考慮乙個人如果贏了i場,那麼他對 非剪刀石頭布的三元組的貢獻是 i i 1 2 也就是他和任意兩個被他擊敗的人都可以組成三元組。並且每個人的貢獻都是獨立的,不會有重複 因...

WC2007 剪刀石頭布 Solution

給一張競賽圖,圖中還有一些邊沒有定向,現在要把它們重新定向,要求重定向之後三元環盡量多。直接考慮不可取,逆向思維。算出極限情況可能出現三元環的個數,那麼就是n n 1 n 2 6 dfrac 6n n 1 n 2 接下來考慮什麼情況會拆毀三元環。考慮乙個點的負場情況來判斷少了多少三元環。如果乙個點負...