• 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A


    解题思路:二分图的最大匹配,但这题是所有点都遍历一遍,所以答案/2;

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #define maxn 100500
    using namespace std;
    struct Edge
    {
        int next;
        int to;
        int fa;
        int w;
    }edge[maxn];
    char s[60][60];
    int t,n;
    int cnt;
    int visit[maxn];
    int head[maxn];
    int match[maxn];
    void add(int u,int v)
    {
        edge[cnt].next=head[u];
        edge[cnt].to=v;
        head[u]=cnt++;
    }
    bool dfs(int u)
    {
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(!visit[v])
            {
                visit[v]=1;
                if(match[v]==-1||dfs(match[v]))
                {
                    match[v]=u;return 1;
                }
    
            }
        }
        return 0;
    }
    int main()
    {
        int tt=0;
        cin>>t;
        while(t--)
        {
            tt++;
            memset(head,-1,sizeof(head));
            cnt=0;
            cin>>n;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                cin>>s[i][j];
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<n;j++)
                {
                    if(s[i][j]=='#'&&s[i][j+1]=='#')
                    {
                       // cout<<j+(i-1)*n<<" "<<j+(i-1)*n+1<<endl;
                        add(j+(i-1)*n,j+(i-1)*n+1);
                        add(j+(i-1)*n+1,j+(i-1)*n);
                    }
                }
            }
            for(int j=1;j<=n;j++)
            {
                for(int i=1;i<n;i++)
                {
                    if(s[i][j]=='#'&&s[i+1][j]=='#')
                    {
                       // cout<<j+(i-1)*n<<" "<<j+(i-1)*n+n<<endl;
                        add(j+(i-1)*n,j+(i-1)*n+n);
                        add(j+(i-1)*n+n,j+(i-1)*n);
                    }
                }
            }
            int ans=0;
            memset(match,-1,sizeof(match));
            for(int i=1;i<=n*n;i++)
            {
                memset(visit,0,sizeof(visit));
                if(dfs(i))
                    ans++;
            }
             cout<<"Case "<<tt<<": "<<ans/2<<endl;
        }
    }
    

      

  • 相关阅读:
    大学的最后时光---我的毕设日记(二)
    大学的最后时光---我的毕设日记(一)
    记公司同事的一次集体活动
    ssh框架基本原理
    plsql基本操作记录
    eclipse快捷键。
    面向对象的特性:封装继承多态
    设置label中的对齐方式
    pixmap和label设置图片自适应大小
    类的继承
  • 原文地址:https://www.cnblogs.com/huangdao/p/9361008.html
Copyright © 2020-2023  润新知