UVALive 6897 Exploration(逆向思维)
2015-12-15 01:23
225 查看
题意:
给定一个N≤2000的图,求一个最大团使得团内每个点的度数至少为k≤2000
分析:
赛上正着想了半天这个签到题,最后发现倒着一想,不停的删掉不符合的点最后剩下的不就是满足的最大团了么
一个队列类似拓扑排序搞搞就好了
代码:
给定一个N≤2000的图,求一个最大团使得团内每个点的度数至少为k≤2000
分析:
赛上正着想了半天这个签到题,最后发现倒着一想,不停的删掉不符合的点最后剩下的不就是满足的最大团了么
一个队列类似拓扑排序搞搞就好了
代码:
// // Created by TaoSama on 2015-12-14 // Copyright (c) 2015 TaoSama. All rights reserved. // //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 2e3 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; int n, m, k; vector<int> G ; bool vis ; int deg ; int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); while(t--) { scanf("%d%d%d", &n, &k, &m); for(int i = 1; i <= n; ++i) G[i].clear(); memset(deg, 0, sizeof deg); memset(vis, false, sizeof vis); while(m--) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); ++deg[u], ++deg[v]; } int ans = n; queue<int> q; for(int i = 1; i <= n; ++i) if(deg[i] < k) q.push(i), vis[i] = true, --ans; while(q.size()) { int u = q.front(); q.pop(); for(int v : G[u]) { if(--deg[v] < k && !vis[v]) { --ans; vis[v] = true; q.push(v); } } } printf("%d\n", ans); } return 0; }
相关文章推荐
- 快速学习JavaScript的6个思维技巧
- 暗时间读书笔记
- 你有没有意识到,计算时代已经悄然降临
- 穷人的饥饿思维
- 思维定势
- 关联性思维和给客户展示功能
- 经典的售前思维题目,一个很经典的故事
- 变革思维
- 肯定式探询---组织发展和变革中的积极思维方式
- 从使用Python开发一个Socket示例说到开发者的思维和习惯问题
- 独立思考者模型:避开思维误区的沼泽
- 编程思想——面向对象架构梦想
- 1.去京城的阻碍 。
- 他们的职业分别是什么?
- 浅谈局部思维的误区
- 为什么要学习英语?
- 12306:小宝到农民工的命
- 计算机思维or人的思维
- 4个小启示,给大脑洗洗澡!
- poj 3660 Cow Contest (Floyd+思维)