zoukankan      html  css  js  c++  java
  • CodeForces 674B.Bear and Two Paths(构造)(思维)

    题意:Bearland有n个城市,从1到n编号。城市通过双向道路连接,每条道路连接了两个不同的城市。Bear Limak想从城市a去到城市b,这里没有直达的路从a直接到b,必须经过一些城市,具体来说,他要从a到b,每个城市必须都经过一次,确切地来说,这里存在一个序列,(v1,v2,...,vn)(v1 == a,vn == b)。现在给定n,k,a,b,c,d,求构造两条路径a到b,c到d,使得这些构造的路径的方案的边的数量<= k,并且每个城市都经过一次。

    分析:贪婪地构造,我们可以这样构造
    ,我们可以让a,c靠在一起,b,d靠在一起,中间的其余点输出就行,第二条方案路径只要添加两条边就可以了,这样可以使得构造的边的数量最少,数量为n + 1,如果k < n + 1,则输出-1,当然4个点的时候,也需要输出-1。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
    	int n, k;
    	scanf("%d%d", &n, &k);
    
    	int a, b, c, d;
    	scanf("%d%d%d%d", &a, &b, &c, &d);
    
    	if (k < n + 1 || n == 4)
    		printf("%d
    ", -1);
    	else
    	{
    		printf("%d %d ", a, c);
    		vector<int> v;
    		//剩下的点
    		for (int i = 1; i <= n; ++i)
    		{
    			if (i != a && i != b && i != c && i != d)
    			{
    				v.push_back(i);
    				printf("%d ", i);
    			}
    		}
    		printf("%d %d
    ", d, b);
    
    		printf("%d %d ", c, a);
    		for (int i = 0; i < v.size(); ++i)
    		{
    			printf("%d ", v[i]);
    		}
    		printf("%d %d ", b, d);
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    AOP编程之cglib动态代理:进阶一
    16-python基础5-文件读写操作
    13-python基础2-条件和循环
    12-python基础1-python概述
    11-linux基础八-正则表达式
    07-linux基础四-系统监控和硬盘分区
    06-linux基础三-文件操作和系统启动流程
    05-linux基础二-用户和权限操作
    04-linux基础一概述和简单命令
    03-网络通信原理
  • 原文地址:https://www.cnblogs.com/pixel-Teee/p/13236625.html
Copyright © 2011-2022 走看看