zoukankan      html  css  js  c++  java
  • Codeforces 1364 D

    https://codeforc.es/contest/1364/problem/D

    看错题了,要求小于等于k的环或者(k+1)/2个独立集

    找环dfs树就行了,独立集不知道定理,就盲找了,前十几个数字总有在最大独立集中参与的吧...所以就和1相连的所有点都猜一猜。。。。

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #include<stack>
    using namespace std;
    typedef long long ll;
    const int maxn = 2e5 + 111;
    vector<int>G[maxn], ins[maxn];
    stack<int>s;
    
    void add(int x, int y) {
    	G[x].push_back(y);
    }
    int dep[maxn];
    int de[maxn];
    int n, k, m;
    int f = 0;
    
    int root = 0;
    int dfs(int x, int fa,int d) {
    	if (f) return 0;
    	if (dep[x]) return 0;
    	dep[x] = d;
    	s.push(x);
    	if (de[x] == 1) root = x;
    
    	for (int p : G[x]) {
    		if (p == fa || f == 1) continue;
    		if (dep[p]) {
    			int ans = dep[x] - dep[p] + 1;
    			
    			if (ans <= k && f == 0 && ans > 0) {
    				f = 1;
    				cout << 2 << endl;
    				cout << ans << endl;
    
    				while (s.top() != p && s.size()) {
    					cout << s.top() << " ";
    					s.pop();
    				}
    				cout << p << " ";
    				cout << endl;
    				return 0;
    			}
    		}
    		else if (dep[p] == 0 && f == 0) {
    			dfs(p, x, d + 1);
    		}
    	}
    	if(s.size()>0) s.pop();
    	return 0;
    }
    int vis[maxn];
    int list[maxn];
    
    int jude(int x) {
    	for (int p : G[x]) {
    		if (list[p]) return 0;
    	}
    	return 1;
    }
    int dfs2(int x,int f) {
    	if (vis[x]) return 0;
    	vis[x] = 1;
    
    	if (jude(x)) {
    		ins[f].push_back(x);
    		list[x] = 1;
    	}
    	for (int p : G[x]) {
    		dfs2(p, f);
    	}
    	return 0;
    }
    vector<int>cn;
    int main() {
    	
    	cin >> n >> m >> k;
    	int len = (k + 1) / 2;
    	
    	for (int i = 0; i < m; i++) {
    		int x, y;
    		cin >> x >> y;
    		add(x, y);
    		add(y, x);
    		de[x]++;
    		de[y]++;
        }
    	dfs(1, -1, 1);
    	//memset(vis, 0, sizeof(vis));
    	if (!f) {
    		for (int i = 1; i <= 10; i++) {
    			cn.push_back(i);
    			for (int p : G[i]) {
    				cn.push_back(p);
    				if (cn.size() >= 10) break;
    			}
    			if (cn.size() >= 10) break;
    		}
    		
    
    		for (int i = 0; i < cn.size(); i++) {
    			int x = cn[i];
    			memset(vis, 0, sizeof(vis));
    			memset(list, 0, sizeof(list));
    			dfs2(x, i);
    		}
    		int cnt = 0;
    		int len = (k + 1) / 2;
    		
    		cout << 1 << endl;
    		
    		for (int i = 0; i < cn.size(); i++) {
    			if (ins[i].size() >= (k + 1) / 2) {
    				for (int j = 0; j < len; j++){
    					cout << ins[i][j] << " ";
    				}
    				return 0;
    			}
    		}
    
    	}
    	return 0;
    }
    

      

    寻找真正的热爱
  • 相关阅读:
    转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件
    转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍
    转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理
    题目总结
    面试题(包含答案)
    ElementUI动态表格数据转换formatter
    父组件搜索列表 给 子组件传值问题
    项目提取公共接口方法
    数组常用方法总结
    vue全局注册
  • 原文地址:https://www.cnblogs.com/lesning/p/13152614.html
Copyright © 2011-2022 走看看