CodeForces 404C Restore Graph (构造)

题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离。

析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int。。。找了好久。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#define debug() puts("++++");
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e16;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 100000 + 10;
const int mod = 100000000;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
  return r >= 0 && r < n && c >= 0 && c < m;
}

vector<int> G[maxn];
int main(){
  scanf("%d %d", &n, &m);
  int rt = -1, cnt = 0;
  int mmax = 0;
  for(int i = 1; i <= n; ++i){
    int x;
    scanf("%d", &x);
    G[x].push_back(i);
    if(x == 0)  rt = i;
    mmax = max(mmax, x);
  }

  if(G[1].size() > G[0].size() * m || G[0].size() != 1){
    printf("-1\n");
    return 0;
  }
  for(int i = 2; i <= mmax; ++i)
    if(G[i].size() > (LL)G[i-1].size() * (m-1)){
      printf("-1\n");
      return 0;
    }

  printf("%d\n", n-1);
  for(int i = 0; i < mmax; ++i){
    bool ok = true;
    int p = 0;
    for(int j = 0; j < G[i].size() && ok; ++j){
      int u = G[i][j];
      for(int k = (i != 0); k < m && ok; ++k){
        printf("%d %d\n", u, G[i+1][p++]);
        if(p == G[i+1].size())  ok = false;
      }
    }
  }
  return 0;
}

  

时间: 2024-11-03 05:42:19

CodeForces 404C Restore Graph (构造)的相关文章

codeforces C. Restore Graph

题意:构造一个有n个顶点,每个点度不超过k,然后给出每一个点到达一个定点的最短距离d数组,然后构造出这样的一个图: 思路:排序之后,有两个距离为0的或者没有直接输出-1,然后用两个游动下表,后面的与前面的度都小于k且它们的距离相差1,就建1条边.然后dfs输出就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include

CodeForces 21D Traveling Graph 状压dp+欧拉回路

题目链接:点击打开链接 题意: 给定n个点m条边的无向图 求从1点开始经过每条边至少一次最后回到1点的最小路程 显然就是找一条路径可重复的欧拉回路 思路: 首先对于欧拉回路的结论是:所有点的度数都为偶数 因为所有边至少经过一次,那么可以把题意转换成加最少多少条边使得图满足以上结论 而加的边目的是为了把奇度数转成偶度数,先floyd一下得到任意点间加边的最小花费 dp[i]表示状态i下度数都为偶数的最小花费. 状压dp,把i状态下,所有未选择的点中挑2个奇度数的转移即可. #include <cs

Codeforces 534C Polycarpus&#39; Dice 构造

题意:给你n个筛子,第 i 个筛子有 可以表示范围 1-a[i]的数,给你最后筛子和,问你每个筛子不可能的值有多少个. 解题思路:得到每个筛子的取值范围. 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 00时38分58秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #includ

Codeforces 466E Information Graph(dfs+并查集)

题目链接:Codeforces 466E Information Graph 题目大意:一开始有n个员工,他们互相独立.现在有三种操作. 1 u v,v称为u的上级 2 u,从u发起一份文件,逐层递交给上级 3 u v,询问u是否查阅过v号文件. 解题思路:将每个文件移动的范围处理出来,然后对于每次询问,将询问拆成两个标记,假设查询x是否浏览过第k号文件,第k号文件的范围为u-v,那么在最后dfs时,遍历到x,判断是否经过u:遍历到v时,判断是否经过x.如果两个都满足,则是YES. #inclu

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

Codeforces 464B Restore Cube(暴力)

题目链接:Codeforces 464B Restore Cube 题目大意:给定8个点坐标,对于每个点来说,可以随意交换x,y,z坐标的数值.问说8个点是否可以组成立方体. 解题思路:直接暴力枚举即可,保证一个点的坐标不变,枚举量为67,将上一层判断. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef

【题解】CF739D Recover a functional graph(构造+二分图匹配)

[题解]CF739D Recover a functional graph(构造+二分图匹配) 题目大意 一个图被称为F图当且仅当每个点出度为1.可以发现这个图是一个内向基环森林,给出所有点到它能到达的环(只会有一个)的距离dis和那个环的长度len,然而有些点的信息模糊了,用?代替,可以是任何数.现在你要输出一个合法的构造方案. 可以提炼出一个图是F图的条件: 对应环的距离数组是自然数数列 \(len=k\)的点的个数是\(tk,t\in N^+\) 由于第二个条件只能用问号补,没有决策需要做

【Codeforces 404C】Restore Graph

[链接] 我是链接,点我呀:) [题意] 每个节点的度数不超过k 让你重构一个图 使得这个图满足 从某个点开始到其他点的最短路满足输入的要求 [题解] 把点按照dep的值分类 显然只能由dep到dep+1连边 设cnt[dep]表示到起点的距离为dep的点的集合 如果cnt[dep].size>cnt[dep+1].size 那么只要把dep层的前cnt[dep+1].size个点和dep+1层的点连就好了 否则 只能让dep层的点每个多连几个dep+1层的点了 [代码] import java

codeforces #402C Searching for Graph 构造

题目大意:给定n和p,我们需要构造一张点数为n,边数为2n+p的简单无向图,满足任意一个点数为k的子图的边数不超过2k+p 逗B题-- 我们只需要把字典序最小的2n+p条边输出就行了 下面我们来证明这么做是对的 首先这个条件等价于[删掉任意k个点,都有至少2k条边被跟着删掉] 然后我们来看这样一个图: 显然这个图是我们构造的图的子图 下面我们来证明这个性质 假如我们删掉了k个点,那么: 如果删掉的k个点都是中间那一列的,由于一个点对应至少两条边,那么我们一定至少删掉了2k条边: 否则: 如果我们