zoukankan      html  css  js  c++  java
  • 数据结构与算法——图(2)

    New Year Transportation

    新年就要来了!在这个世界中,有n个单元格,它们的编号是从1到n,就像一个1×n板。人住在细胞里。然而,它很难在不同的细胞之间移动,因为很难逃离细胞。

    人们想要认识住在其他牢房的人。因此,tncks0121用户制作了一个运输系统,在这些细胞之间移动,以庆祝新年。首先,他想到n - 1个正整数a 1, a 2,…, a n - 1。每个整数 i where 1 ≤ i ≤ n - 1 条件 1 ≤ a i  ≤ n - i

    接下来,他制作了n - 1个入口,用从1到n - 1的整数进行编号。i _th(1≤in - 1)门户连接单元i和单元(i + a i),可以使用i -th门户从单元i到单元(i + a i)。不幸的是,不能向后使用门户,这意味着不能使用i _th门户从单元格(i + a i)移动到单元格i。很容易看出,由于条件1≤ ain -i,一个人不能使用门户离开线路世界。

    目前我在1号牢房,我想去t牢房。然而,我不知道是否有可能去那里。请确定我是否可以只使用构造的运输系统去细胞t

    输入

    //第一行是两个用空格分隔的整数n(3≤n≤3×104)和t(2≤t≤n)——我要去的单元格数量和单元格的索引。第二行包含n - 1个用空格分隔的整数a1, a2,…, an - 1 (1 ≤ ai ≤ n - i).这是可以保证的,使用给定的交通系统,一个人不能离开线的世界。
    8 4
    1 2 1 2 1 2 1
    8 5
    1 2 1 2 1 1 1
    

    输出

    //如果我可以使用运输系统进入t单元,打印“YES”。否则,打印“不”。
    YES
    NO
    

    备注:

    在第一个样本中,访问的细胞为:1、2、4;这样我们就能成功访问细胞4。

    在第二个样本中,可能访问的细胞为:1、2、4、6、7、8;所以我们不能访问我们想访问的5号细胞。

    C

    #include<stdio.h>
    int a[30000];
    int main()
    {
    	int n,t;
    	while(scanf("%d%d",&n,&t)!=EOF)
    	{
    		int flag=0;
    		for(int i=1;i<=n-1;i++)
    		{
    			scanf("%d",&a[i]);
    		}
    		for(int i=1;i<=n-1;)
    		{
    			if(i+a[i]==t)
    			{
    				flag=1;
    				break;
    			}
    			else
    			{
    				i=i+a[i];
    			}
    		}
    		if(flag)
    		    printf("YES
    ");
    		else
    		    printf("NO
    ");
    	}
    	return 0;
    } 
    //https://blog.csdn.net/qq_34681949/article/details/52598351
    

    C. Ice Skating

    巴伊泰克正在学习滑冰。他是个新手,所以他唯一的交通方式就是从雪堆上向北、东、南、西滑动,直到他降落在另一个雪堆上。他已经注意到,用这种方式从一些积雪堆到另一些是不可能通过任何顺序的移动。他现在想堆一些额外的雪堆,这样他就可以从任何雪堆到任何其他雪堆。他让你找出需要制造的积雪的最小数量。我们假设Bajtek只能在整数坐标下堆积积雪。

    示例

    输入

    //输入的第一行包含一个整数n(1≤n≤100)——积雪的数量。以下n行每一行包含两个整数xi和yi(1≤xi, yi≤1000)-第i个雪堆的坐标。注意,北方向coinсides Oy轴的方向,所以东方向coinсides牛轴的方向。所有雪堆的位置都是不同的。
    2
    2 1
    1 2
    2
    2 1
    4 1
    

    输出

    //输出需要创建的雪堆的最小数量,以便Bajtek能够从任何其他雪堆到达任何雪堆。
    1
    0
    

    C

    # include <stdio.h>
    int pre[101];
    struct node
    {
        int x, y;
    }a[101];
     
    void init(int n)
    {
        for(int i=0; i<=n; ++i)
            pre[i] = i;
    }
     
    int find(int x)
    {
        if(x != pre[x])
            pre[x] = find(pre[x]);
        return pre[x];
    }
     
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            init(n);
            int ans = 0;
            for(int i=0; i<n; ++i)
                scanf("%d%d",&a[i].x, &a[i].y);
            for(int i=0; i<n; ++i)
                for(int j=i+1; j<n; ++j)
                {
                    if(a[i].x==a[j].x || a[i].y == a[j].y)
                    {
                        int px = find(i);
                        int py = find(j);
                        if(px != py)
                        {
                            ++ans;
                            pre[py] = px;
                        }
                    }
                }
            printf("%d
    ",n-1-ans);
        }
        return 0;
    }
    //https://blog.csdn.net/junior19/article/details/54989665
    

    CodeForces 330B Road Construct

    一个国家有n个城市。最初,该国没有道路。一天,国王决定修建一些连接成对城市的道路。可以以任何一种方式穿越道路。他希望以这样的方式建造这些道路,即通过最多两条道路横越每个城市都可以到达任何其他城市。您还会得到 m对城市-无法在这两对城市之间建造道路。

    您的任务是构造仍满足上述条件的最小数量的道路。约束条件将确保这始终是可能的。

    输入描述:

    第一行包含两个整数n和m。然后是m条线,每条线由两个整数a_i和b_i(1≤a_i, b_i≤n, a_i≠b_i)组成,这意味着不可能修建一条连接城市a_i和b_i的道路。假设这些城市的编号是从1到n。保证每个城市对在输入中最多出现一次。

    输出描述:

    您应该在第一行中打印一个整数s:应该构建的道路的最小数量。然后是s线,每条s线由两个整数a_i和b_i(1≤a_i, b_i≤n, a_i≠b_i)组成,即在城市a_i和b_i之间修建道路。如果有多个解决方案,您可以打印其中的任何一个。

    示例

    输入
    4 1 
    1 3
    
    输出
    3 
    1 2 
    4 2 
    2 3
    

    这是一个可能的解决方案的例子:

    img

    以下是一些错误解决方案的例子:

    img

    上面的解决方案是错误的,因为它没有使用最小的边数(4 vs 3)。此外,它还尝试在城市1和城市3之间建造一条道路,而输入指定不允许在城市1和城市3之间建造道路。

    img

    上述解决方案是错误的,因为从一个城市到另一个城市至少需要穿过3条路,而在你的国家,从任何一个城市到另一个城市至少需要穿过2条路。

    img

    最后,上面的解决方案是错误的,因为从一个城市到另一个城市必须是可能的,而在这个国家不可能从城市1到3,从城市2到城市3,从城市4到城市3。

    C

    #include <iostream>
    #include <algorithm> 
    #include <cstdio>  
    #include <cstdlib>  
    #include <cmath>  
    #include <cstring>  
    #include <string>  
    using namespace std;  
    int a[10010]; 
    int main()  
    {  
        int n,m,x,y,i,cnt;  
        scanf("%d %d",&n,&m);  
        for(i=0;i<m;i++)  
        {  
            scanf("%d %d",&x,&y);  
            a[x]++;                  //把出现的数对作为数组a的下标,记录存在
            a[y]++;  
        }  
        for(i=1;i<=n;i++)  
        {  
            if(a[i]<1)               //寻找那个公共点cnt
            {  
                cnt=i;  
                break;  
            }  
        }  
        printf("%d
    ",n-1);  
        for(i=1;i<=n;i++)  
        {  
            if(i!=cnt)  
            {  
                printf("%d %d
    ",i,cnt);  //依次输出与公共点相连的点
            }  
        }  
        return 0;  
    } 
    //https://blog.csdn.net/coco_astrids/article/details/52592418
    
  • 相关阅读:
    20080619 SQL SERVER 输入 NULL 的快捷键
    20090406 Adobe的“此产品的许可已停止工作”错误的解决办法
    20080908 Office Powerpoint 2007 不能输入中文的解决办法
    20080831 ClearGertrude Blog Skin 's cnblogs_code class
    20080603 Facebook 平台正式开放
    20080519 安装 Microsoft SQL Server 2000 时提示 创建挂起的文件操作
    test
    Linux—fork函数学习笔记
    SOA的设计理念
    Why BCP connects to SQL Server instance which start with account of Network Service fail?
  • 原文地址:https://www.cnblogs.com/wwj99/p/12221232.html
Copyright © 2011-2022 走看看