zoukankan      html  css  js  c++  java
  • 【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.io.*;
    import java.util.*;
    
    public class Main {
        
        
        static InputReader in;
        static PrintWriter out;
            
        public static void main(String[] args) throws IOException{
            //InputStream ins = new FileInputStream("E:\rush.txt");
            InputStream ins = System.in;
            in = new InputReader(ins);
            out = new PrintWriter(System.out);
            //code start from here
            new Task().solve(in, out);
            out.close();
        }
        
        static int N = (int)1e5;
        static class Task{
        	
        	class Pair{
        		int x,y;
        		public Pair(int x,int y) {
        			this.x = x;
        			this.y = y;
        		}
        	}
            
            int n,k;
            ArrayList<Integer> g[] = new ArrayList[N+10];
            ArrayList<Pair> ans = new ArrayList<>();
            
            
            public void solve(InputReader in,PrintWriter out) {
            	for (int i = 0;i <= N;i++) g[i]=new ArrayList<Integer>(); 
            	n = in.nextInt();k = in.nextInt();
            	for (int i = 1;i <= n;i++) {
            		int d;
            		d = in.nextInt();
            		g[d].add(i);
            	}
            	if ((int)g[0].size()>1) {
            		out.println(-1);
            	}else {
            		for (int i = 1;i <= n;i++)
            			if ((int)g[i].size()>0 && g[i-1].isEmpty()) {
            				out.println(-1);
            				return;
            			}
            		for (int i = 1;i <= n;i++) {
            			if (g[i].isEmpty()) break;
            			int x = g[i].size();
            			int y = g[i-1].size();
            			//out.println(x+" "+y);
            			if (y>=x) {
            				for (int j = 0;j < x;j++) {
            					ans.add(new Pair(g[i-1].get(j),g[i].get(j)));
            				}
            				int ma = 1;
            				if (i-1>=1) {
            					ma = 2;
            				}
            				if (ma>k) {
            					out.println(-1);
            					return;
            				}
            			}else {
            				//y<x
            				int need = x/y;
            				if (x%y!=0) need++;
            				int ma = need;
            				//out.println(ma);
            				if (i-1>=1) ma++;
            				if (ma>k) {
            					out.println(-1);
            					return;
            				}
            				for (int j = 0;j < x;j++) {
            					int now = j;
            					now = now % y;
            					ans.add(new Pair(g[i-1].get(now),g[i].get(j)));
            				}
            			}
            		}
            		out.println((int)ans.size());
            		for (int i = 0;i < ans.size();i++) {
            			out.println(ans.get(i).x+" "+ans.get(i).y);
            		}
            	}
            }
        }
    
        
    
        static class InputReader{
            public BufferedReader br;
            public StringTokenizer tokenizer;
            
            public InputReader(InputStream ins) {
                br = new BufferedReader(new InputStreamReader(ins));
                tokenizer = null;
            }
            
            public String next(){
                while (tokenizer==null || !tokenizer.hasMoreTokens()) {
                    try {
                    tokenizer = new StringTokenizer(br.readLine());
                    }catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                return tokenizer.nextToken();
            }
            
            public int nextInt() {
                return Integer.parseInt(next());
            }
        }
    }
    
  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10562232.html
Copyright © 2011-2022 走看看