SPOJ 1421 - Goods(置换)
来源:互联网 发布:软件开发源代码管理 编辑:程序博客网 时间:2024/05/16 02:02
题意:一个1到n的排列,可以对两个数字进行交换,每轮可进行多次交换,但是每个数字每轮只能交换一次,问几轮才能把排列变成从1,2,3...,n的排列
思路:找出所有的循环节,长度为2的循环节只需要进行一次,剩下的则需要两次
证明:长度为2的循环节只进行一次交换显而易见,而剩下的可以拉成一条链的形式(将排列与1,2,3,...,n的排列连线),如果把这条链由两头向中间依次交换(即第i个与第k+1-i个进行交换),则会打破原来交叉的链,也就是分解了循环节,交叉的链最长为2,所以只需要两次就OK了
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int A[5010];int F[5010];int t[5010];int vis[5010];int ct,ans,d[5010][2];int dfs(int x){ t[++ct]=A[x]; if(!vis[A[x]]) { vis[A[x]]=1; dfs(A[x]); }}int check(int n){ for(int i=1; i<=n; i++) { if(i!=A[i])return 0; } return 1;}int solve(int n){ int f=0; memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { if(!vis[i]) { ct=0; vis[i]=1; dfs(i); if(ct>2)f=1; if(ct>=2) { for(int j=1; j<=ct/2; j++) { d[ans][0]=t[j]; d[ans][1]=t[ct+1-j]; ans++; swap(A[F[t[j]]],A[F[t[ct+1-j]]]); swap(F[t[j]],F[t[ct+1-j]]); } } } } if(!f) return 0; else return 1;}int main(){ int n,f=0; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&A[i]); F[A[i]]=i; } ans=0; if(check(n)) { printf("0\n"); } else { if(!solve(n)) { printf("1\n%d",ans); for(int i=0;i<ans;i++) printf(" %d-%d",d[i][0],d[i][1]); printf("\n"); } else { printf("2\n%d",ans); for(int i=0;i<ans;i++) printf(" %d-%d",d[i][0],d[i][1]); printf("\n"); ans=0; solve(n); printf("%d",ans); for(int i=0;i<ans;i++) printf(" %d-%d",d[i][0],d[i][1]); printf("\n"); } } return 0;}
- SPOJ 1421 - Goods(置换)
- zoj 1655 Transport Goods(dijkstra)
- zoj 1655 Transport Goods(Dijkstra~~)
- 行置换密码 (列置换密码)
- zoj 1655 Transport Goods (最短路变形)
- zoj 1655 Transport Goods(最短路径)
- 【CF 724E】Goods transportation(最小割+DP)
- delphi 加密(置换)
- Cow Sorting(置换)
- Ural1024 (LCM+置换)
- 置换(群论)
- (4)简单置换
- (5)复杂置换
- 数组置换(基础)
- good goods
- goods.java
- Goods类
- Goods类
- android自定义progressbar图片大小自适应
- 黑马程序员--07.集合框架--02.【迭代器Iterator】
- Cocos2d-x 的内存管理
- linux蓝牙驱动代码阅读笔记
- 智能穿戴设备层出不穷,果壳智能手表为何先人一步?
- SPOJ 1421 - Goods(置换)
- 10+ jQuery Sliding Sidebar Panel Plugins
- weblogic集群
- 读写文件(fstream)
- 你的代码写的很烂.
- AspNetPager分页
- Apache myfaces介绍和配置
- rg.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unab
- silverlight的Datagrid的超复杂表头写法