玄学贪心(将90pts和70pts的贪心结合了一下过了……)
查看原帖
玄学贪心(将90pts和70pts的贪心结合了一下过了……)
415473
☯☯枫☯☯楼主2021/3/4 22:05

hack 掉自己玄学做法的数据

附玄学做法:

#include<bits/stdc++.h>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=301;
int n,m,dep[N],depst,sz[N];
vector<int> f[N];
bool vis[N],mk[N];
void dfs(int x,int deep) {
    dep[x]=deep;
    depst=max(depst,deep);
    for(register int j=0; j<f[x].size(); j++) {
        int &pos=f[x][j];
        if(vis[pos])continue;
        vis[pos]=1;
        dfs(pos,deep+1);
        sz[x]+=sz[pos];
    }
}
void rec(int x) {
    for(register int j=0; j<f[x].size(); j++) {
        int &pos=f[x][j];
        if(dep[pos]<dep[x])continue;
        vis[pos]=mk[pos]=1;
        rec(pos);
    }
}
int main() {
//	freopen("data.in","r",stdin);
    scanf("%d%d",&n,&m);
    F(i,1,m) {
        static int u,v;
        scanf("%d%d",&u,&v);
        f[u].push_back(v);
        f[v].push_back(u);
    }
    F(i,1,n)sz[i]=1;
    vis[1]=1;
    dfs(1,1);
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    F(i,2,depst) {
        register int mx=-1,id=0;
        F(j,1,n) {
            if(!vis[j] and dep[j]==i) {
                vis[j]=1;
                int t=f[j].size();
                if(sz[j]+t>mx)mx=sz[j]+t,id=j;
            }
        }
        mk[id]=1,rec(id);
    }
    register int ans=0;
    F(i,2,n)ans+=mk[i];
    printf("%d",n-ans);
    return 0;
}
2021/3/4 22:05
加载中...