Loading...

洛谷P3852 小朋友

check评论:0 条 remove_red_eye浏览量:57 change_historyTags:编程学习笔记
作者 : deco date_range日期 : 2019-11-19

链接

弦图求最大独立集

显然求出完美消除序列后,我们直接贪心的从第一个点开始选,选到不能选为止,选出的个数就是最大的答案

/*  Never Island  */
/*deco loves Chino*/
#include <bits/stdc++.h>
using namespace std;
int lis[210],pos[210],n,m,vis[210];
int mmp[210][210],cnt,head[210],ans[210],t[210];
struct edge
{
    int next,to;    
}e[40010];
void add(int u,int v)
{
    e[++cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}
struct node
{
    int ind,id;
    node(int A,int B):ind(A),id(B){}
    bool operator<(const node&a)const
    {
        return ind<a.ind;
    }
};
priority_queue<node> q;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y),add(y,x);
    }
    for(int i=1;i<=n;i++)
    {
        q.push(node(0,i));
    }
    cnt=n;
    while(!q.empty())
    {
        node u=q.top();
        q.pop();
        if(!vis[u.id])
        {
            lis[cnt]=u.id;
            pos[u.id]=cnt--;
            vis[u.id]=1;
            for(int i=head[u.id];i;i=e[i].next)
            {
                int v=e[i].to;
                if(!vis[v])
                {
                    ans[v]++;
                    u.id=v,u.ind=ans[v];
                    q.push(u);
                } 
            }
        }
    }
    int rans=0;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        int u=lis[i];
        cnt=0;
        if(!vis[u])
        {
            rans++;
            vis[u]=1;
        }
        else
        {
            continue;
        }
        for(int j=head[u];j;j=e[j].next)
        {
            int v=e[j].to;
            vis[v]=1;
        }
    }
    cout<<rans;
    return 0;
}

暂无评论

正在回复给  
去登陆?

   点击刷新验证码

标签云

文章留名