题面:

  有N个人参加一场比赛,赛程规定任意两个人之间都要进行一场比赛:这样总共有N*(N-1)/2场比赛。比赛已经进行了一部分,我们想知道在极端情况下,比赛结束后最多会发生多少剪刀石头布情况。即给出已经发生的比赛结果,而你可以任意安排剩下的比赛的结果,以得到尽量多的剪刀石头布情况。
  剪刀石头布情况,即无序三元组(A, B, C),满足其中的一个人在比赛中赢了另一个人,另一个人赢了第三个人而第三个人又胜过了第一个人。

分析:

  把题意转化一下,就是给定了一张有向完全图的残本,剩下的边你可以任意安排,求出现最多的三元环数量。

  我们可以用一下小小的容斥,假如我们任选三个点,方案数是C(n,3),我们就找出最少失去的三元环数量,就可以给出这个题的答案了。

  根据《一眼看出法》,我们可以了解,假如一个点x的入度(以下简称in[x])为w,那么它会使整个图失去的三元环数量为C(w,2)。

  即:如果一个点的入度增加1,会使三元环数量减少in[x]-1这么多。所以我们需要尽量保证不会出现某个点入度特别多,换句话说就是尽量让入度平均。(这大概就是题解中说的凸函数的性质???)

  所以,我们将失去的三元环作费用,跑费用流。

  对于未定向的边,我们将其抽象成点(这里原图中的点也被抽象成点)

  我们由源点S向每条未定向的边对应的点连边,容量为1费用为0;

  对于每条被我们建成点的边,我们从这个点向这条边连通的两个点连边,容量为1,费用为0,表示这条边会给其中一个点带来入度加一的贡献。

  对于每个原图上的节点x,我们想汇点T连接若干条边,容量都为1,费用分别为in[x], in[x]+1, in[x]+2,…,n-2(表示每增加1个单位的流量,就会带来这么多三元环的毁灭。想想为什么最大是n-2?)

  之后定向方案,看边对应的点哪条出边满流即可!

代码:

 #include<bits/stdc++.h>
using namespace std;
const int N=,inf=0x3f3f3f3f;int f[N];
struct node{int y,z,f,nxt;}e[N*];int lst[N];
int n,S,T,tot,g[][],dg[N],tmp[N],X[N],Y[N];
int h[N],c=,d[N],vis[N],pre[N],ans;queue<int>q;
void add(int x,int y,int l,int z){
e[++c]=(node){y,z,l,h[x]};h[x]=c;
e[++c]=(node){x,-z,,h[y]};h[y]=c;
} bool spfa(){
for(int i=S;i<=T;i++) pre[i]=-,
f[i]=inf,lst[i]=vis[i]=,d[i]=inf;
q.push(S);d[S]=;pre[S]=;
while(!q.empty()){
int x=q.front();q.pop();vis[x]=;
for(int i=h[x],y;~i;i=e[i].nxt)
if(d[y=e[i].y]>d[x]+e[i].z&&e[i].f){
d[y]=d[x]+e[i].z;pre[y]=x;lst[y]=i;
f[y]=min(f[x],e[i].f);
if(!vis[y]) vis[y]=,q.push(y);
}
} return pre[T]!=-;
} void solve(){
while(spfa()){
ans+=d[T]*f[T];int x=T;
while(x) e[lst[x]].f-=f[T],
e[lst[x]^].f+=f[T],x=pre[x];
} return ;
} int main(){
memset(h,-,sizeof(h));
scanf("%d",&n);S=,tot=n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
scanf("%d",&g[i][j]);
if(g[i][j]==){
if(i>j) continue;
X[++tot]=i,Y[tot]=j;
add(S,tot,,);
add(tot,i,,);
add(tot,j,,);
tmp[i]++;tmp[j]++;
} else dg[i]+=g[i][j];
} T=++tot;for(int i=;i<=n;i++){
ans+=(dg[i]*dg[i]-dg[i])/;
for(int j=dg[i]+;j<n;j++)
add(i,T,,j-);
} solve();int tt=n*(n-)*(n-)/;
printf("%d\n",tt-ans);
for(int i=n+,v;i<tot;i++){
for(int p=h[i];~p;p=e[p].nxt)
if(e[p].y!=S&&!e[p].f)
{v=e[p].y;break;}
if(v==X[i]) g[X[i]][Y[i]]=,
g[Y[i]][X[i]]=;
else g[X[i]][Y[i]]=,g[Y[i]][X[i]]=;
} for(int i=;i<=n;i++,puts(""))
for(int j=;j<=n;j++)
printf("%d ",g[i][j]);return ;
}

费用流

WC2007 石头剪刀布 数学+最小费用最大流的更多相关文章

  1. BZOJ2597 [Wc2007]剪刀石头布(最小费用最大流)

    题目大概是说n个人两两进行比赛,问如何安排几场比赛的输赢使得A胜B,B胜C,C胜A这种剪刀石头布的三元组最多. 这题好神. 首先,三元组总共有$C_n^3$个 然后考虑最小化不满足剪刀石头布条件的三元 ...

  2. bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】

    脑子不太清楚一个zz问题调了好久-- 首先正难则反,因为三元环好像没什么特点,就考虑让非三元环个数最小 考虑非三元环特点,就是环上一定有一个点的入度为2,联系整张图,三元环个数就是每个点C(入度,2) ...

  3. HDU5988/nowcoder 207G - Coding Contest - [最小费用最大流]

    题目链接:https://www.nowcoder.com/acm/contest/207/G 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5988 ...

  4. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  5. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  6. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  9. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

随机推荐

  1. 彻底解决SysFader:IEXPLORE.EXE应用程序错误

    彻底解决SysFader:IEXPLORE.EXE应用程序错误 转载于 西部e网(weste.net) 最近安装了IE8浏览器玩玩,但是发现一个严重的问题,就是在访问某些页面的时候,经常会出现“ysF ...

  2. javascript复制内容到剪切板/网页上的复制按钮的实现

    javascript复制内容到剪切板/网页上的复制按钮的实现:DEMO如下 <!doctype html> <html> <head> <meta chars ...

  3. Reduction operations

    Reuction operations Reduction operations A reduction operations on a tensor is an operation that red ...

  4. cxf CXF搭建webService服务器

    http://observer.blog.51cto.com/4267416/1231205 手动发布: public class ServerMain { public static void ma ...

  5. Unix\Linux | 总结笔记 |文件系统

    1.  ls [选项] [文件]     显示目录中的文件信息 -a    显示全部文件(包括隐藏文件) -l    查看文件的属性.大小等详细信息  (ls -l 详解) -al   查看当前目录中 ...

  6. ural1076 Trash 垃圾

    Description You were just hired as CEO of the local junkyard.One of your jobs is dealing with the in ...

  7. Android 插件技术:动态加载dex技术初探

    1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...

  8. Android开发学习——简单类图

    1.类A继承于类B    (B 是父类,A是 子类) 2.小汽车.自行车 实现车的接口 3.A中有B这个成员变量,单向关联 4.聚合,整体与部分的关系.has-a  B中的构造函数(或set方法)需要 ...

  9. [ SDOI 2010 ] 古代猪文

    \(\\\) Description 一句话题意: 设 \(x=\sum_{d|n} C_n^d\),求 \(G^x\pmod {999911659}\) . 从原题面大段语文中其实不难推出所求. \ ...

  10. 原生开发之css样式问题(持续更新)

    ·移动端开发将div高度设置为设备高度 div{ Height:100vh; } · select选择器文字设置: /*select文字右对齐*/ select{ direction: rtl; } ...