【二分图最大匹配】BZOJ1562 [NOI2009]变换序列
来源:互联网 发布:摇色子软件 编辑:程序博客网 时间:2024/05/17 04:58
题面在这里
题目绕了半天,其实很简单……
对于任意
已知Di的情况下,求Ti
其实讨论一发就会发现,有4种可能:
其实有两对互相矛盾的存在,那么每个i就一定只有2种可能了
其实i与Ti构成了二分图。
建图后刷出最大匹配即可。
然而……题目要求字典序最小
于是邻接表把Ti大的边先建,然后从后往前增广i
这样就能保证字典序最小,因为匈牙利算法是对后处理的节点优先
示例程序:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=20005,maxe=20005;int n,res;int tot,son[maxe],nxt[maxe],lnk[maxn];inline void add(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;}int con[maxn],vis[maxn],Tim=0,ans[maxn];bool find(int x){ for (int j=lnk[x];j;j=nxt[j]) if (vis[son[j]]!=Tim){ vis[son[j]]=Tim; if (con[son[j]]==-1||find(con[son[j]])) return con[son[j]]=x,1; } return 0;} int main(){ scanf("%d",&n); for (int i=0;i<n;i++){ int d;scanf("%d",&d); int a=(i+d)%n+n,b=(i-d+n)%n+n; if (a<b) swap(a,b); add(i,a);add(i,b); } memset(con,255,sizeof(con)); for (int i=n-1;i>=0;i--) Tim++,res+=find(i); for (int i=n;i<2*n;i++) ans[con[i]]=i-n; if (res!=n) return printf("No Answer"),0; printf("%d",ans[0]); for (int i=1;i<n;i++) printf(" %d",ans[i]); return 0;}
阅读全文
2 0
- 【二分图最大匹配】BZOJ1562 [NOI2009]变换序列
- [BZOJ1562]NOI2009变换序列|二分图匹配
- 【bzoj1562】 NOI2009 变换序列 二分图匹配
- bzoj1562 NOI2009变换序列 二分图匹配(匈牙利)
- bzoj1562 [NOI2009]变换序列(二分图完美匹配+贪心)
- [bzoj1562][NOI2009]变换序列(贪心+dfs/二分图最大匹配)
- [BZOJ1562][NOI2009]变换序列
- bzoj1562 [NOI2009]变换序列
- bzoj1562[NOI2009] 变换序列
- BZOJ1562: [NOI2009]变换序列
- 【NOI2009】bzoj1562 变换序列
- bzoj 1562: [NOI2009]变换序列 二分图最大匹配
- NOI2009 变换序列【transform】二分图匹配
- 【二分图匹配】【NOI2009】变换序列
- 【bzoj1562】 NOI2009—变换序列
- 【NOI2009】Bzoj1562 & Codevs1843 变换序列
- 【bzoj1562】【noi2009】【变换序列】【匈牙利算法】
- BZOJ1562——[NOI2009]变换序列
- C 语言中的元素指针与一维数组指针
- jQuery获取元素内部元素和获取内容的区别、获得输入框value的方法
- Spring之——多Service实现的引用方式(插曲)
- 【模板】压位高精度
- 阶乘之和
- 【二分图最大匹配】BZOJ1562 [NOI2009]变换序列
- MyBatis Generator自动生成MyBatis的映射代码
- HTTP协议
- 为什么要重写hashcode()方法
- mysql约束之修改和删除
- 阶乘之和
- 初学java--输出helloworld,转移符以及注释的使用
- tensorflow报错:Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul')
- 【shell】结构控制-循环语句