暴搜80分TLE,码风清新求减枝
查看原帖
暴搜80分TLE,码风清新求减枝
513900
Wilson_Lee楼主2022/11/20 19:56
#include<bits/stdc++.h>
using namespace std;

const int MAXN=305;
vector<int>G[MAXN];
vector<int>point[MAXN];
int dep[MAXN];
bool vis[MAXN];
int ans=MAXN,sum;
void dfs(int x,int father)
{
    dep[x]=dep[father]+1;
    for(auto y:G[x]) if(y!=father) dfs(y,x);
}
void solve(int x,int father)
{
    if(sum>=ans) return;
    ++sum;
    for(auto y:G[x]) if(!vis[y] && y!=father) solve(y,x);
}
void cut(int x)
{
    if(point[x].empty())
    {
        sum=0,solve(1,0),ans=min(ans,sum);
        return;
    }
    for(auto i:point[x]) vis[i]=1,cut(x+1),vis[i]=0;
}
int main()
{
    int n,m;
    cin>>n>>m;
    int u,v;
    for(int i=1;i<=m;++i)
    {
        scanf("%d %d",&u,&v);
        G[u].push_back(v),G[v].push_back(u);
    }
    dfs(1,0);
    for(int i=1;i<=n;++i) point[dep[i]].push_back(i);
    cut(2);
    cout<<ans;
    return 0;
}
2022/11/20 19:56
加载中...