2019CCPCharbin F-Fixing Banners (dfs / húngaro)

Significado del título : elija una letra para cada una de las seis cadenas para formar "harbin"

Idea: Cuando vi esta pregunta, mi primer sentimiento fue dfs. Mi compañero de equipo cg gritó que este es un partido húngaro porque acababa de aprender el partido húngaro. Parecía asustar a los amigos en la mesa de al lado, pero después de que cg copió el tablero durante mucho tiempo, encontré el tablero algo mal. . . Finalmente, usé dfs. Al complementar la pregunta, también la escribí en dfs, pero descubrí que si la poda no es completa, será T. Ahora, después de aprender la coincidencia en húngaro (descubrí que no es un algoritmo difícil), utilicé la coincidencia húngara de nuevo. En teoría, la complejidad de Hungría es la peor. 6 ^ 3, dfs es el peor 6! Los dos últimos algoritmos tienen un tiempo similar. Publicaré ambas formas de escribir a continuación.

Escritura húngara

#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l + r >> 1)
#define lo (o << 1)
#define ro (lo | 1)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 998244353;
struct tri{int x,y,z;};
string harbin="harbin";
bool edg[6][6],vis[6];
int linker[6];

bool dfs(int u)
{
    for(int v=0;v<6;v++)if(edg[u][v]&&!vis[v])
    {
        vis[v]=1;
        if(linker[v]==-1||dfs(linker[v]))
        {
            linker[v]=u;
            return 1;
        }
    }
    return 0;
}

bool solve()
{
    memset(edg,0,sizeof(edg));
    memset(linker,-1,sizeof(linker));
    for(int i=0;i<6;i++)
    {
        string s;cin>>s;
        for(auto j:s)for(int k=0;k<6;k++)
            if(j==harbin[k])edg[i][k]=1;
    }//建图
    int ans=0;
    for(int i=0;i<6;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))ans++;
    }
    return ans==6;
}
 
int main()
{
    // freopen("in.txt","r",stdin);
    int _;cin>>_;
    while(_--)
    {
        if(solve())puts("Yes");
        else puts("No");
    }
    return 0;
}

Escritura DFS

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef float ld;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
const char harbin[10]={"harbin"};
 
int boa[6][6],vis[6];
 
bool dfs(int step)
{
    if(step==6)return 1;
    for(int i=0;i<6;i++)
    {
        if(boa[step][i]&&vis[i]==0)
        {
            vis[i]=1;
            if(dfs(step+1))
            {
                return 1;
            }
            vis[i]=0;
        }
    }
    return 0;
}
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(boa,0,sizeof(boa));
        memset(vis,0,sizeof(vis));
        string s[6];
        for(int i=0;i<6;i++)
            cin>>s[i];
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<s[i].length();j++)
            {
                for(int k=0;k<6;k++)
                {
                    if(harbin[k]==s[i][j])boa[i][k]=1;
                }
            }
        }
 
        if(dfs(0))puts("Yes");
        else puts("No");
    }
 
    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_43700916/article/details/104237410
Recomendado
Clasificación