[SDOI2019]热闹又尴尬的聚会(图论+set+构造)

据说原数据可以让复杂度不满的暴力O(Tn^2)过掉……O(Tn^2)方法类似于codeforces一场div2的E题

有一种比较好的方法:每次找出原图G中度最小的点加入q,然后将相邻的点加入新图G‘。这显然能够得到一个最大的独立集。而p可以在维护度最小的点最大这一过程中,把G的所有点加入集合p。因为set带一个log,所以复杂度为O(T(n+m)logn)。

证明:满足(p+1)(q+1)>n即可。删除的q节点中d的度数和满足Σ(d[i]+1)=n,其中i∈q,然后max{d[i]}q>=n,于是(max{d[i]}+1)q>n,而p>=max{d[i]},所以命题成立。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
int n,m,n1,n2,len,deg[N],vis[N],s1[N],s2[N],b[N];
vector<int>G[N];
struct node{int u,d;}a[N];
bool operator<(node a,node b){return a.d==b.d?a.u<b.u:a.d<b.d;}
typedef set<node>::iterator iter;
set<node>S;
inline int read()
{
    int x=0,w=0;
    char ch=0;
    while(!isdigit(ch))w|=ch==‘-‘,ch=getchar();
    while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return w?-x:x;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        n=read(),m=read();
        n1=n2=len=0;
        for(int i=1;i<=n;i++)G[i].clear(),deg[i]=vis[i]=0,a[i]=(node){i,0};
        for(int i=1;i<=m;i++)
        {
            int x=read(),y=read();
            G[x].push_back(y),G[y].push_back(x);
            deg[x]++,deg[y]++,a[x].d++,a[y].d++;
        }
        for(int i=1;i<=n;i++)S.insert(a[i]);
        int mxd=-1,mx=0;
        while(!S.empty())
        {
            int u=(*S.begin()).u;
            if(deg[u]>mxd)mxd=deg[u],mx=len;
            S.erase(S.begin());
            b[++len]=u,s2[++n2]=u,vis[u]=1;
            for(int i=0;i<G[u].size();i++)
            {
                int v=G[u][i];
                iter it=S.find((node){v,deg[v]});
                if(it==S.end())continue;
                S.erase(it),b[++len]=v;
                for(int j=0;j<G[v].size();j++)
                {
                    int t=G[v][j];
                    it=S.find((node){t,deg[t]});
                    if(it==S.end())continue;
                    S.erase(it),S.insert((node){t,--deg[t]});
                }
            }
        }
        for(int i=mx+1;i<=len;i++)s1[++n1]=b[i];
        printf("%d",n1);for(int i=1;i<=n1;i++)printf(" %d",s1[i]);
        printf("\n%d",n2);for(int i=1;i<=n2;i++)printf(" %d",s2[i]);
        puts("");
    }
}

原文地址:https://www.cnblogs.com/hfctf0210/p/10837880.html

时间: 2025-01-18 05:29:10

[SDOI2019]热闹又尴尬的聚会(图论+set+构造)的相关文章

[SDOI2019] 热闹又尴尬的聚会

热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow \lceil(n-p-1+1)/(p+1)\rceil\le q\&\rightarrow \lceil(n-p)/(p+1)\rceil\le q\&\rightarrow (n-p)/(p+1)\le q\&\rightarrow n-p\le pq+q\&\righta

vijos2054 SDOI2019 热闹的聚会与尴尬的聚会

题目链接 思路 首先观察题目最后的式子\(\lfloor \frac{n}{p + 1} \rfloor \le q\) 并且\(\lfloor \frac{n}{q+1} \rfloor \le p\). 这个式子其实就是告诉我们\(p\)和\(q\)都要尽量大. 然后这道题就可以分成两个小题: 1.求一个子图,使得图中最小度数最大. 2.求最大独立集. 先看第一个问题: 可以贪心的每次将度数最小的点删去.剩下的点中度数最小的那个就是当前图的贡献.然后找一个最大的贡献就是答案. 第二个问题 求

图论-六人聚会

六人聚会 题目描述: 设有任意六个人聚会,证明这六个人中要么三个人曾经相识,要么三人曾经不相识. 题目分析: 可以设A.B.C.D.E.F六个点,分别代表一个人,这六个人构成一个完全图. (1)如果两个人相识,那么两个人用一红边连起来 (2)如果两个人不相识,那么两个人用一条蓝边连起来 所以,题目就可以等价于一个完全图中存在或者不存在两个同色三角形的问题. 考察某一顶点F,根据抽屉原理,与F相连的关联的边中必有三条同色(问题1)那么设这F与这三个人A.B.C的关系都是蓝色,而A.B.C三人中,必

树形动态规划 fjutoj-2392 聚会的快乐

聚会的快乐 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 你要组织一个由你公司的人参加的聚会.你希望聚会非常愉快,尽可能多地找些有趣的热闹.但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵.给定N个人(姓名,他幽默的系数,以及他上司的名字),编程找到能使幽默系数和最大的若干个人. Input 第一行一个整数N(N<100).接下来有N行,每一行描述一个人的信息,信

POJ 3268 迪杰斯特拉图论 置换找最短路

题目:https://vjudge.net/problem/POJ-3268 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connect

聚会的快乐

题目描述 你要组织一个由你公司的人参加的聚会.你希望聚会非常愉快,尽可能多地找些有趣的热闹.但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵.给定N个人(姓名,他幽默的系数,以及他上司的名字),编程找到能使幽默系数和最大的若干个人. 输入输出格式 输入格式: 第一行一个整数N(N<100).接下来有N行,每一行描述一个人的信息,信息之间用空格隔开.姓名是长度不超过20的字符串,幽默系数是在0到100之间的整数. 输出格式: 所邀请的人最大的幽默系数和. 输入输出样例 输入样例#1: 5

简谈图论重要性

从外地学习回来,我对图论才有认识(以前就没接触过,非常尴尬),说实话,学好图论的重要性,就像学数学时在进行解析几何时,图极有可能是打开答案的最后秘钥,也就是数形结合,而懂的人永远明白,用图解决绝对比用解析简单(一般情况).而图论对于oi选手说,就是一大杀器,有可能利己,也可能抱憾终身.所以说图论的重要性就很显然了. 大家在进入图论的时候,应该先掌握链式前向星建图,当然也可以叫邻接表,先附上我喜欢的模板 struct node{ int next,to,w; }edge[maxn<<4]; in

雪漏有啲尴尬,佢畀交住都唔好走佬

雪漏有啲尴尬,佢畀交住,都唔好走佬,雪漏睇到商幸灾乐祸笑,忽然就发现小乖点都举住细,大眼都一眨一眨嘅睇住佢睇.双眼对视,小乖都恨恨嘅倔佢一眼,畀啲雪漏觉得一头雾水嘅.与其揾个生暴妹子,不如小乖嚟演戏丫嘛,雪漏就朝住小乖伸出咗手:"就系嗰个黑大个身边啲细路女."商冇计带雪漏嘅随口黑一啲,唔知咩时候就揽住楚兮一蚊睇戏,都冇起哄.灯光如柱,照喺咗小乖身上,呢个又纯又靓啲竹升妹真系超有气质嘅. https://www.huxiu.com/member/1485425/n.html 舒服,但雪漏

第九节 图论和搜索

1. 图论算法(用BFS,DFS) 拓扑排序 克隆图 找连通块 六度问题 2.BFS 队列实现:    树中的BFS与图中的BFS有什么不同?树中没有环,图中有环需要一个set来记录搜索过的节点: 应用:图的遍历,最短路径 3 搜索   搜索题的套路比较固定.