zoukankan      html  css  js  c++  java
  • bzoj1562[NOI2009] 变换序列

    题目链接:bzoj1562

    题目大意:

    给出一个序列(0~n-1),这个序列经过某个变换会成为另外一个序列,但是其中的元素不会改变,给出初始序列与变换后的序列每一位上的“距离”,求字典序最小的变换序列。#cp


    题解:

    匈牙利求二分图的最大匹配

    //居然A了QwQ好感人
    就是把一个元素跟它能变幻到的连边,(为什么我感觉可以有四种orz然后大家说的是最多两条边可能是我没有仔细研究=-=)。然后跑匈牙利看看能否完美匹配就好了。
    由于方案要字典序最小,所以考虑选边的顺序。让比较小的先被选到,就是大的先连。而匈牙利中从N-1开始匹配。因为越早匹配完成,后面的点如果与前面的产生冲突,那么一定是先完成匹配的点(编号更大的)的匹配点变大。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define maxn 10100
    
    struct node
    {
    	int x,y,next;
    }a[maxn*4];int len,first[maxn];
    int d[maxn],as[maxn],bf[maxn],ask[maxn],tim;
    void ins(int x,int y)
    {
    	len++;a[len].x=x;a[len].y=y;
    	a[len].next=first[x];first[x]=len;
    }
    bool ffind(int x)
    {
    	for (int i=first[x];i!=-1;i=a[i].next)
    	 if (ask[a[i].y]!=tim)
    	 {
    		 int y=a[i].y;
    		 ask[y]=tim;
    		 if (bf[y]==-1 || ffind(bf[y]))
    		 {
    			 bf[y]=x;as[x]=y;
    			 return true;
    		 }
    	 }
    	return false;
    }
    int main()
    {
    	int n,i,ans;
    	scanf("%d",&n);
    	len=0;memset(first,-1,sizeof(first));
    	for (i=0;i<n;i++) scanf("%d",&d[i]);
    	for (i=0;i<n;i++)
    	{
    		if (d[i]>n-d[i])
    		{
    			if (i+d[i]<n) ins(i,i+d[i]);
    			if (i+n-d[i]<n) ins(i,i+n-d[i]);
    			if (i>=n-d[i]) ins(i,i-n+d[i]);
    			if (i>=d[i]) ins(i,i-d[i]);
    		}else
    		{
    			if (i+n-d[i]<n) ins(i,i+n-d[i]);
    			if (i+d[i]<n) ins(i,i+d[i]);
    			if (i>=d[i]) ins(i,i-d[i]);
    			if (i>=n-d[i]) ins(i,i-n+d[i]);
    		}
    	}
    	ans=tim=0;
    	memset(bf,-1,sizeof(bf));
    	memset(ask,0,sizeof(ask));
    	for (i=n-1;i>=0;i--)
    	{
    		tim++;
    		if (ffind(i)) ans++;
    	}
    	if (ans!=n) printf("No Answer
    ");
    	else
    	{
    		printf("%d",as[0]);
    		for (i=1;i<n;i++)
    		 printf(" %d",as[i]);
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    直接用ISO文件在linux上安装新系统
    vsftpd config备忘
    失恋那回事~~~
    Java之深入JVM(0) 序
    No.6 ThreadLocal类及应用技巧
    Java之多线程(1) Race Condition引起的性能问题
    NO.10 Callable与Future的应用
    NO.5 线程范围内共享变量的概念与作用(二)
    NO.5 线程范围内共享变量的概念与作用(一)
    NO.7多个线程之间共享数据的方式探讨
  • 原文地址:https://www.cnblogs.com/Euryale-Rose/p/6527796.html
Copyright © 2011-2022 走看看