任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562

题目:

对于0,1,…,N-1的N个整数,给定一个距离序列D0,D1,…,DN-1,定义一个变换序列T0,T1,…,TN-1使得每个i,Ti的环上距离等于Di。一个合法的变换序列应是0,1,…,N-1的一个排列,任务是要求出字典序最小的那个变换序列。

题解:

二分建图是显而易见的,可是怎么处理字典序最小?

大神博客:https://www.byvoid.com/blog/noi-2009-transform/

实际倒着做一遍就可以了,正确性显然(只不过我不是这样写的);

先做最大匹配,然后看所匹配的是否为最小标号,不是则强行改值,然后再做最大匹配看是否有完备匹配,无则将值改回。

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool vis[];
int f[],pre[],v[],now[];
int a[],b[];
int n,ans,tot,cc;
void insert(int a, int b)
{
tot++; pre[tot]=now[a]; now[a]=tot; v[tot]=b;
}
bool dfs(int x)
{
if (x<cc) return false;
for (int i=now[x]; i; i=pre[i])
{
if (!vis[v[i]])
{
vis[v[i]]=true;
if (f[v[i]]==- || dfs(f[v[i]]))
{
f[v[i]]=x;
f[x]=v[i];
return true;
}
}
}
return false;
}
int main()
{
int d;
scanf("%d",&n);
tot=;
for (int i=; i<=n; i++)
{
scanf("%d",&d);
a[i]=(i+d) % n;
if (a[i]==) a[i]=n;
b[i]=(i-d);
if (b[i]<)
b[i]+=n;
if (a[i]>b[i])
{
int c;
c=a[i]; a[i]=b[i]; b[i]=c;
}
a[i]+=n; b[i]+=n;
insert(i,a[i]);
insert(i,b[i]);
}
memset(f,-,sizeof(f));
ans=;
for (int i=; i<=n; i++)
{
memset(vis,false,sizeof(vis));
if (dfs(i)) ans++;
}
if (ans<n) { printf("No Answer\n"); return ;}
for (int i=; i<=n; i++)
{
if (f[i]!=a[i])
{
cc=i;
memset(vis,false,sizeof(vis));
int t=f[a[i]];
f[a[i]]=i;
f[b[i]]=-;
vis[a[i]]=true;
if (dfs(t))
{
f[i]=a[i];
}
else
{
f[b[i]]=i;
f[a[i]]=t; }
}
}
for (int i=; i<n; i++)
{
printf("%d ",f[i]-n-);
}
printf("%d\n",f[n]-n-);
return ;
}

bzoj1562[NOI2009]变换序列——2016——3——12的更多相关文章

  1. BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  2. [BZOJ1562][NOI2009] 变换序列

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  3. BZOJ1562——[NOI2009]变换序列

    1.题意:题意有些难理解 2.分析:我们发现如果要求判断是否合法的话就so easy了,二分图匹配即可,但是我们发现要求输出字典序最小的,那么我们在匈牙利的时候就倒着枚举,另外邻接表中的边一定要排好序 ...

  4. BZOJ1562 [NOI2009]变换序列 【KM算法】

    题目 输入格式 输出格式 输入样例 5 1 1 2 2 1 输出样例 1 2 4 0 3 提示 30%的数据中N≤50: 60%的数据中N≤500: 100%的数据中N≤10000. 题解 每个位置可 ...

  5. Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  6. BZOJ 1562 [NOI2009] 变换序列

    [NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...

  7. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  8. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

  9. Luogu P1963 [NOI2009]变换序列(二分图匹配)

    P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...

随机推荐

  1. AdminLTE的使用

    1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta content=& ...

  2. 【转】调用getActionBar()报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar

    解决办法: 第一种方法:修改AndroidManifest.xml中的minSdkVersion=11   第二种方法: 1.导入android-support-v7-appcompat项目,并将其作 ...

  3. 剑指offer 调整数组顺序使得奇数位于偶数前面

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution { public:     void  ...

  4. android AsyncTask介绍 转载

    http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html AsyncTask和Handler对比 1 ) AsyncTask实 ...

  5. check_partition_aft_merge.sql

    spool ./05_check_partition_aft_merge.log @/tmp/rda/chk_freets set echo on feedback on set pagesize 4 ...

  6. FusionCharts生成报表应用

    1.需要组装要展示的数据,至于如何怎样去设计数据模型,看你要展示的图形和需要的数据就行了.来个简单的. 实体类,只有两个属性,也可以使用Bean里面的实体类,无所谓了. package com.gol ...

  7. 饥饿的牛(hunger)

    饥饿的牛(hunger) 题目描述 牛在饲料槽前排好了队.饲料槽依次用1到n(1≤n≤2000)编号.每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料.约翰提供B个区间的清单.一个区间是一对 ...

  8. Oracle教程-查询(二)

    emp 雇员表字段名称   数据类型       是否为空   备注--------   -----------   --------   --------EMPNO    NUMBER(4)     ...

  9. git log 查看 当前分支的 提交历史

    git log  查看 当前分支的 提交历史 在提交了若干更新之后,想回顾下提交历史,可以使用 git log 命令查看 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排 ...

  10. CG之基本光照模型计算公式

    在一个基本模型里,一个物体表面的颜色是由放射(emissive).环境反射(ambient).漫反射(diffuse)和镜面反射(specular)等光照作用的总和.每种光照作用取决于表面材质的性质( ...