ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

专题测试四 图论 A - pSort

2022-02-21 15:06:20  阅读:151  来源: 互联网

标签:图论 专题 fa int 元素 number cell pSort find


  1. 题目

    One day n cells of some array decided to play the following game. Initially each cell contains a number which is equal to it's ordinal number (starting from 1). Also each cell determined it's favourite number. On it's move i-th cell can exchange it's value with the value of some other j-th cell, if |i - j| = di, where di is a favourite number of i-th cell. Cells make moves in any order, the number of moves is unlimited.

    The favourite number of each cell will be given to you. You will also be given a permutation of numbers from 1 to n. You are to determine whether the game could move to this state.

    Input

    The first line contains positive integer n (1 ≤ n ≤ 100) — the number of cells in the array. The second line contains n distinct integers from 1 to n — permutation. The last line contains n integers from 1 to n — favourite numbers of the cells.

    Output

    If the given state is reachable in the described game, output YES, otherwise NO.

    Sample 1
    Input Output
    5
    5 4 3 2 1
    1 1 1 1 1
    
    YES
    
    Sample 2
    Input Output
    7
    4 3 5 1 2 7 6
    4 6 6 1 6 6 1
    
    NO
    
    Sample 3
    Input Output
    7
    4 2 5 1 3 7 6
    4 6 6 1 6 6 1
    
    YES
    
  2. 思路
    写之前先吐槽下,这个星期的题都是些什么高达
    元素可以换到自己最喜欢的距离上,意味着这个元素可以与自己距离d的元素任意交换
    对于任意两个元素a和b,如果a能和c交换,b也能和c交换,那么经由c进行中转,a、b也能交换,而且可以不改变c处元素的值
    所以任意两个可以交换的元素可以视为在一个连通块中,在一个连通块中的元素可以任意交换而不产生其他影响
    用并查集判断每个元素当前位置和目标位置在不在一个连通块中,都满足则YES,不满足则NO
  3. 代码
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    int fa[105],p[105],love[105];
    
    int find(int x)
    {
    	if(fa[x]!=x)
    		fa[x] = find(fa[x]);
    	return fa[x];
    }
    
    void build(int x,int y)
    {
    	int a=find(x);
    	int b=find(y);
    	fa[a] = b;
    }
    
    int main()
    {
    	int n,q;
    	long long ans;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		fa[i] = i;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&q);
    		p[q]=i;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&love[i]);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(i-love[i]>=1)
    		build(i,i-love[i]);
    		if(i+love[i]<=n)
    		build(i,i+love[i]);
    	}
    	int f=1;
        for(int i=1;i<=n;i++)
        {
    		if(find(p[i])!=find(i))
    		{
    			f=0;
    			break;
    		}
        }
    	if(f==1)
    	{
    		printf("YES\n");
    	}
    	else
    	{
    		printf("NO\n");
    	}
    	return 0;
    }

标签:图论,专题,fa,int,元素,number,cell,pSort,find
来源: https://www.cnblogs.com/Benincasa/p/15918885.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有