正题

题目链接:https://www.luogu.com.cn/problem/P4249


题目大意

\(n\)个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多。

\(1\leq n\leq 100\)


解题思路

竞赛图如果三个点不能构成三元环有一个性质就是恰好有一个点的度数等于\(2\),可以考虑减去不能构成三元环的方案。

也就说对于一个点\(x\)如果我们选出它的两条出边那么这个就不能构成三元环而且只会在点\(x\)统计一次。

所以答案就是

\[\binom n 3-\sum_{i=1}^n\binom{deg_i}2
\]

现在我们要最小化后面那个东西,这个就比较简单了,因为对于一条没有确定的边要么给\(x\)加度数要么给\(y\)加度数,我们可以考虑费用流,如果一条边可以指向\(x\)那么就连向点\(x\)费用\(0\)流量\(1\)。

然后对于每个点连接汇点的时候流量都是一,然后费用分别为\(0,1,2,3,...n-1\)就好了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10;
struct node{
int to,next,w,c;
}a[N*20];
int n,tot=1,s,t,cnt,ans;
int p[110][110],c[110][110],ls[N],f[N],mf[N],pre[N];
bool v[N];queue<int> q;
void addl(int x,int y,int w,int c){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;
return;
}
bool SPFA(){
memset(f,0x3f,sizeof(f));
q.push(s);f[s]=0;v[s]=1;mf[s]=1e9;
while(!q.empty()){
int x=q.front();q.pop();v[x]=0;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(a[i].w&&f[x]+a[i].c<f[y]){
f[y]=f[x]+a[i].c;pre[y]=i;
mf[y]=min(mf[x],a[i].w);
if(!v[y])v[y]=1,q.push(y);
}
}
}
return f[t]<=2147483647/3;
}
void Updata(){
int x=t;
ans+=mf[t]*f[t];
while(x!=s){
a[pre[x]].w-=mf[t];
a[pre[x]^1].w+=mf[t];
x=a[pre[x]^1].to;
}
return;
}
int main()
{
scanf("%d",&n);
s=1;t=2;cnt=n+2;
for(int i=3;i<=n+2;i++)
for(int j=0;j<n;j++)
addl(i,t,1,j);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int x;p[i][j]=++cnt;
scanf("%d",&x);
c[i][j]=x;
if(i>=j)continue;
addl(s,cnt,1,0);
if(x==0||x==2)addl(cnt,j+2,1,0);
if(x==1||x==2)addl(cnt,i+2,1,0);
}
while(SPFA())
Updata();
printf("%d\n",n*(n-1)*(n-2)/6-ans);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(c[i][j]!=2||i>=j)continue;
int x=p[i][j];
if(a[ls[x]].w)c[i][j]=0,c[j][i]=1;
else c[i][j]=1,c[j][i]=0;
}
for(int i=1;i<=n;i++,putchar('\n'))
for(int j=1;j<=n;j++)
printf("%d ",c[i][j]);
return 0;
}

最新文章

  1. 创建Hello World程序(part-1)
  2. Objective-C精选字符串处理方法
  3. Java 8新特性终极指南
  4. Query 一些简单的效果
  5. JAVA缓存技术
  6. Scrum会议10(Beta版本) 补交
  7. 追加文件内容java
  8. (二)程序中的内存&amp;&amp;栈
  9. 关于alarm函数
  10. spm3 基本
  11. C++ 之 Asio 库
  12. Telephone Lines [POJ3662] [二分答案]
  13. spark优化整理
  14. 已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步代码时,还是提示输入密码?
  15. Django-jet自定义菜单
  16. Linux 各种软件的安装-Jenkins和svn结合
  17. css代码插入三种方式
  18. Android和PHP开发最佳实践
  19. commons-pool2
  20. 使用Yii2中dropdownlist实现地区三级联动的例子

热门文章

  1. IO流(File类--递归--过滤器--IO字节流--IO字符流--Properties集合--缓冲流--转换流--序列化流--打印流)
  2. 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力
  3. nginx《一安装》
  4. Spring Cloud总结
  5. 基于Linux系统的网络服务——高速缓存DNS及企业级域名解析服务
  6. 发布日志 - kratos v2.0.5 版本发布
  7. Windows系统一些好用的办公工具
  8. Appium问题解决方案(8)- selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not sign with default certificate.
  9. Jenkins(4)- 在centos7.x下完全卸载Jenkins
  10. Python - 虚拟环境 venv