贪心可行吗?

P2016 战略游戏

北京 @ 2021-05-03 09:53:31

每次都把士兵放在度数最多的点

思路可行吗

代码如下:

//P2016 战略游戏 贪心
#include<bits/stdc++.h>
using std::vector;
vector<int>e[1500+10];
long long cnt;
struct de
{
    int index,d;
}deg[1500+10];
inline int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
    return s*w;
}
int main()
{
    int n=read();
    for(int i=1;i<=n;++i)
    {
        int xx=read(),x=read();
        for(int j=1;j<=x;++j)
        {
            int u=read();
            e[xx].push_back(u);
            e[u].push_back(xx);
            ++deg[xx].d,++deg[u].d;
        }
    }

    for(int i=0;i<n;++i)
        deg[i].index=i;

    int maxn=0,max_seq=0;
    for(int i=0;i<n;++i)
        if(deg[i].d>maxn)maxn=deg[i].d,max_seq=i;
    while(maxn)
    {
        for(int i=0;i<e[max_seq].size();++i)
            --deg[e[max_seq][i]].d;
        deg[max_seq].d=0;
        ++cnt;
        maxn=0;
        for(int i=0;i<n;++i)
            if(deg[i].d>maxn)maxn=deg[i].d,max_seq=i;
    }

    printf("%d",cnt);
    return 0;
}

感谢指教


by 北京 @ 2021-05-03 09:54:18

总之交了好像没过

试了几组样例好像没有问题,也不知道为什么会挂掉三个点


by 摸鱼酱 @ 2021-05-03 09:57:12

考虑一条长度为 5 的链 1-2-3-4-5,显然选 2 和 4 就可以,但是只按照度数排序可能会出问题吧


by 摸鱼酱 @ 2021-05-03 09:57:23

还是写树形dp吧


by 摸鱼酱 @ 2021-05-03 09:58:35

@北京


by 北京 @ 2021-05-03 10:05:15

@摸鱼酱 啊这,为什么按度数排序会出问题?


by 北京 @ 2021-05-03 10:05:40

@摸鱼酱 树形dp已经过了一遍,想试试贪心写法


by 摸鱼酱 @ 2021-05-03 10:06:33

我换一下编号变成 0-3-1-2-4,找到的第一个度数最大的点是 1,选到它之后答案就一定不是最优的了 @北京


by 北京 @ 2021-05-03 10:09:37

@摸鱼酱 哦,懂了

感谢大佬!


|