注:此题无序,也无嵬

正文

我们这题求得事实上是一个最大费用最大流,最后的对每条边进行枚举,额然后,如果最大费用小了,就计入答案。。

算是,比较水吧

还有,一开始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] 匹配的更多相关文章

  1. 【刷题】BZOJ 5154 [Tjoi2014]匹配

    Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...

  2. BZOJ5154 [Tjoi2014]匹配 【KM算法 + 枚举】

    题目链接 BZOJ5154 题解 先跑出一个匹配方案 然后暴力删去每对匹配再检验一下答案是否减小 使用KM算法提升速度 #include<algorithm> #include<io ...

  3. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  4. scanf类型不匹配造成死循环

        int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...

  5. 使用注解匹配Spring Aop切点表达式

    Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...

  6. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

  7. webpack配置别名alias出现的错误匹配

    @(webpack) webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gu ...

  8. perl 如何匹配ASCII码以及ASCII码转换

    匹配ASCII码:   /[:ascii:]/ ASCII码转换为数字: ord() 数字转换为ASCII码: chr()

  9. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

随机推荐

  1. 【Nginx入门系列】第二章 外部无法访问Nginx服务器

    问题 Nginx服务器已经搭建成功,并且已经启动(如下图所示),并且可以ping通nginx服务器的ip地址,但是外部机子无法访问 Nginx服务器(没法显示欢迎页面) 解决方案 一般这种情况是出现在 ...

  2. 4..部署场景2:带有遗留的Linux Bridge

    此场景描述了使用Linux bridge的ML2插件实现OpenStack网络服务的遗留(基本)实现. 遗留实现通过为常规(非特权)用户提供一种方法来管理一个项目中的虚拟网络,并包含以下组件:提供了自 ...

  3. DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  4. Codeforces_734_F

    http://codeforces.com/problemset/problem/734/F x|y + x&y = x+y. #include<iostream> #includ ...

  5. 实例演示:如何在Kubernetes上大规模运行CI/CD

    本周四晚上8:30,第二期k3s在线培训如约开播!本期课程将介绍k3s的核心架构,如高可用架构以及containerd.一起来进阶探索k3s吧! 报名及观看链接:http://z-mz.cn/PmwZ ...

  6. 【WPF学习】第四十五章 可视化对象

    前面几章介绍了处理适量适中的图形内容的最佳方法.通过使用几何图形.图画和路径,可以降低2D图形的开销.即使正在使用复杂的具有分层效果的组合形状和渐变画刷,这种方法也仍然能够正常得很好. 然而,这样设计 ...

  7. 虚拟机ubuntu的网络连接类型

    图很好 https://jingyan.baidu.com/article/91f5db1b17e8a01c7f05e3e6.html 很详细,有实例 https://www.cnblogs.com/ ...

  8. Linux 邮件服务

    三个要点 1.smtp协议 2.搭建本地邮件服务器 3.使用外部邮件服务器 实现邮件功能 1.smtp协议           SMTP(Simple Mail Transfer Protocol)即 ...

  9. docker部署带mysql数据库连接的.netcore程序

    docker部署带mysql数据库连接的程序和部署普通的程序完全一致 数据库可以是物理机删的mysql,同时也可以是docker里的mysql. 如果是docker中的mysql,配置连接字符串和物理 ...

  10. 【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T2 采药人接水果

    [问题描述] 采药人虽然 AFO(SU),但他在闲暇的时候还是可以玩一玩接水果(cat)的.但他渐渐发现 cat 好像有点太弱智.于是他不想浪费他的智商,于是决定写一个程序帮他玩. cat 是这样玩的 ...