这道题爆搜能过吗?
查看原帖
这道题爆搜能过吗?
507348
__vector__楼主2022/4/24 22:43

我调了半天爆搜,仍然17分,想问一下有没有剪枝可以通过此题
我的爆搜:

#include <bits/stdc++.h>
using namespace std;
namespace Main
{
    const int maxn=55;
    int n,m;
    vector<int> imap[maxn];
    int ans[maxn];
    int top;
    bool vis[maxn];
    int dis[maxn][maxn];
    void dfs(int x,int cnt)//cnt代表走过了几个点
    {
        ans[++top]=x;
        if(x==1&&cnt==n+1)
        {
            for(int i=1;i<top;i++)
            {
                printf("%d ",ans[i]);
            }
            printf("\n");
            top--;
            return;
        }
        if(cnt>=n+1&&((n+1)-cnt<dis[x][1]))
        {
            top--;
            return;
        }
        vis[x]=1;
        for(int to:imap[x])
        {
            if(!vis[to]||(to==1&&top==n))
            {
                dfs(to,cnt+1);
            }
        }
        vis[x]=0;
        top--;
    }
    inline void floyd()
    {
        for(int mid=1;mid<=n;mid++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    dis[i][j]=min(dis[i][j],dis[i][mid]+dis[mid][j]);
                }
            }
        }
    }
    void main()
    {
        memset(dis,0x3f3f3f3f,sizeof(dis));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            imap[u].emplace_back(v);
            dis[u][v]=1;
        }
        for(int i=1;i<=n;i++)
        {
            sort(imap[i].begin(),imap[i].end());
        }
        floyd();
        dfs(1,1);
        #ifndef ONLINE_JUDGE
        system("pause");
        #endif
    }
}
int main()
{
    Main::main();
    return 0;
}
2022/4/24 22:43
加载中...