[TJOI2014] 匹配
注:此题无序,也无嵬
正文
我们这题求得事实上是一个最大费用最大流,最后的对每条边进行枚举,额然后,如果最大费用小了,就计入答案。。
算是,比较水吧
还有,一开始WA了两次是因为,dis应初始化为负无穷
/* make by ltao */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <fstream>
#include <math.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <string>
#include <complex>
#include <sstream>
#include <set>
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
#define sz 666666
#define fake int
#define re return
#define get() getchar()
#define inf 1e6
#define diss(i) dis[i]+h[i]
using namespace std;
int read(){
int x=0;bool f=0;
char ch=get();
while(ch<'0'||ch>'9'){
if(ch=='-') f=1;
ch=get();
}
while(ch<='9'&&ch>='0'){
x=(x<<1)+(x<<3)+(ch-'0');
ch=get();
}
return f?-x:x;
}
const int Maxn=81;
#define Maxx 2*Maxn
#define Maxm Maxn*Maxn*2
int n,cnt,s,t,maxflow,maxcost,h[Maxx],dis[Maxx],cur[Maxx],a[Maxx];
bool vis[Maxx];
struct Edge{
int to,lac,flow,cost;
bool can;
void insert(int x,int y,int z,int w){
to=y;lac=h[x];flow=z;cost=w;h[x]=cnt++;
}
}edge[Maxm],vedge[Maxm];
void add_edge(int x,int y,int z,int w){
vedge[cnt].insert(x,y,z,w);
vedge[cnt].insert(y,x,0,-w);
}
int val=-1;
bool spfa(int s,int t){
for(int i=1;i<=t;i++) dis[i]=-0x3f3f3f3f;
memcpy(cur,h,sizeof cur);
queue<int> q;
dis[s]=0;vis[s]=1;q.push(s);
while(!q.empty()){
int fr=q.front();
vis[fr]=0;
q.pop();
for(int i=h[fr];i!=-1;i=edge[i].lac){
int to=edge[i].to;
if(edge[i].flow>0&&!edge[i].can&&dis[to]<dis[fr]+edge[i].cost){
dis[to]=dis[fr]+edge[i].cost;
if(!vis[to]){
vis[to]=1;
q.push(to);
}
}
}
}
return dis[t]!=-0x3f3f3f3f;
}
int dfs(int u,int min1){
if(u==t) return min1;
int sum=min1;vis[u]=1;
for(int i=cur[u];i!=-1;i=edge[i].lac){
int to=edge[i].to;
if(!vis[to]&&!edge[i].can&&dis[to]==dis[u]+edge[i].cost&&edge[i].flow>0){
cur[u]=i;
int ret=dfs(to,min(sum,edge[i].flow));
sum-=ret;edge[i].flow-=ret;edge[i^1].flow+=ret;
if(sum==0) break;
}
}
vis[u]=0;
return min1-sum;
}
void Dinic(int s,int t){
while(spfa(s,t)){
int ret=dfs(s,0x3f3f3f3f);
maxflow+=ret;
maxcost+=ret*dis[t];
}
re ;
}
int main(){
freopen("YJOI2016.in","r",stdin);
n=read();
s=0;t=n<<1|1;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++) add_edge(s,i,1,0);
for(int j=n+1;j<=n<<1;j++) add_edge(j,t,1,0);
for(int i=1;i<=n;i++) for(int j=n+1;j<=n*2;j++) add_edge(i,j,1,read());
memcpy(edge,vedge,sizeof edge);
Dinic(s,t);
int cnt1=0;
for(int i=0;i<cnt;i++){
int to=edge[i].to,fr=edge[i^1].to;
if(!edge[i].flow&&fr<=n&&fr>=1&&to>n&&to<=n*2)
a[++cnt1]=i;
}
printf("%d\n",maxcost);
int max1=maxcost;
for(int i=1;i<=cnt1;i++){
memcpy(edge,vedge,sizeof edge);
edge[a[i]].can=1;
edge[a[i]^1].can=1;
maxflow=0;
maxcost=0;
Dinic(s,t);
if(maxflow==n&&maxcost!=max1)
printf("%d %d\n",edge[a[i]^1].to,edge[a[i]].to-n);
edge[a[i]].can=0;
edge[a[i]^1].can=0;
}
re 0;
}
我看到有人拿km写的,算了,我还是好好用费用流吧,,,
[TJOI2014] 匹配的更多相关文章
- 【刷题】BZOJ 5154 [Tjoi2014]匹配
Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...
- BZOJ5154 [Tjoi2014]匹配 【KM算法 + 枚举】
题目链接 BZOJ5154 题解 先跑出一个匹配方案 然后暴力删去每对匹配再检验一下答案是否减小 使用KM算法提升速度 #include<algorithm> #include<io ...
- javascript匹配各种括号书写是否正确
今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...
- scanf类型不匹配造成死循环
int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...
- 使用注解匹配Spring Aop切点表达式
Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...
- .net使用正则表达式校验、匹配字符工具类
开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...
- webpack配置别名alias出现的错误匹配
@(webpack) webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gu ...
- perl 如何匹配ASCII码以及ASCII码转换
匹配ASCII码: /[:ascii:]/ ASCII码转换为数字: ord() 数字转换为ASCII码: chr()
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
随机推荐
- vscode中内置集成终端显示为git(bash.exe)
按下快捷键 ctrl+` (其中的点是esc键下英文状态的点)调出vscode集成终端,也可从菜单栏的“查看→终端”中调出,默认显示的是系统cmd: 在设置中搜索 integrated shell 将 ...
- Web自动化测试项目(三)用例的组织与运行
一.Unittest用例组织 在test_case目录下创建test*.py,组织测试用例 ├── test_case │ ├── __init__.py │ └── test_login.p ...
- Shiro身份验证及授权(二)
一.Shiro 身份验证 身份验证的步骤: 收集用户身份 / 凭证,即如用户名 / 密码: 调用 Subject.login 进行登录,如果失败将得到相应的 AuthenticationExcepti ...
- laravel 服务容器的由来 代码展示
<?php /** * 目的:代码的完善来说明从 基础类的调用到 工厂类的使用 再到容器的出现的原因 * (首先要明白工厂类和容器的关系 可以理解:容器就是工厂类的升级版(为了解决类的依赖)) ...
- FFMPEG结构体分析:AVCodecParameters
/** * This struct describes the properties of an encoded stream. * * sizeof(AVCodecParameters) is no ...
- java上传组件commons-fileupload的一些使用方法
在 http://www.apache.org,下载commons-fileupload-1.2.1.jar包,并把这个包加到工程中,以下是记录这个上传组件的一些使用方法. html测试页面,实现上传 ...
- 用Java实现简单的网络聊天程序
Socket套接字定义: 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他 ...
- MySQL关系型数据库基础操作
MySQL基础 一.MySQL常用数据类型 1.常用数值类型(INT,DOUBLE,FLOAT) ① int 或者 integer 类型: 大小(字节):4字节: 范围: (有符号: -2147483 ...
- Java框架之SpringSecurity-权限系统
SpringSecurity SpringSecurity融合Spring技术栈,提供JavaEE应用的整体安全解决方案:提供全面的安全服务.Spring Security支持广泛的认证模型 模块划分 ...
- 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...