首页 > 其他 > 详细

L3-015 球队“食物链” [DFS+减枝]

时间:2019-03-12 19:18:39      阅读:166      评论:0      收藏:0      [点我收藏+]

这题应该很容易想到DFS,但需要加个减枝。

首先我们知道,他要形成食物链必然是把五支球队都包括进去了,也就是说必然存在1吃x,y吃1。题目又要求字典序最小,那你1不排在第一个,谁还敢上啊。所以我们的DFS便是由1开始。而这恰恰为减枝铺好了路。

考虑到1在第一位,所以在食物链尾端的辣个队必然要吃掉1,也就是第一列除第一行剩下的行中要存在W。我们在每次DFS中,只要判断是否存在W即可。不存在直接结束当前DFS。

详见代码~

No Solution想当然多加了一个感叹号。。。。。。。检查了好久。。。。。。。。自罚3题。。。。退群了。。。。。

技术分享图片
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <math.h>
#include <queue>
#include <vector>
#include <functional>
#define maxn 105
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,flag;
char ma[maxn][maxn];
int win[maxn][maxn],ans[maxn];
int vis[maxn];
void DFS(int x,int d)
{
    if(flag)
        return;
    if(d==n)
    {
        if(win[x][1])
        {
            flag=1;
            printf("1");
            for(int i=1;i<=d-1;i++)
                printf(" %d",ans[i]);
            printf("\n");
        }
        return;
    }
    int k;
    for(k=2;k<=n;k++)
    {
        if(!vis[k]&&win[k][1])
            break;
    }
    if(k==n+1)
        return;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]&&win[x][i])
        {
            ans[d]=i;
            vis[i]=1;
            DFS(i,d+1);
            vis[i]=0;
        }
    }
}
int main()
{
    flag=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",ma[i]+1);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(ma[i][j]==W)
                win[i][j]=1;
            if(ma[i][j]==L)
                win[j][i]=1;
        }
    }
    vis[1]=1;
    DFS(1,1);
    if(!flag)
        printf("No Solution\n");
    return 0;
}
View Code

 

L3-015 球队“食物链” [DFS+减枝]

原文:https://www.cnblogs.com/FTA-Macro/p/10518739.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!