zoukankan      html  css  js  c++  java
  • HDU 4185 Oil Skimming

    题目大意:在一个N*N的矩阵里寻找最多有多少个“##”(横着竖着都行)。

     
     
    题目分析:重新构图,直接以相邻的两个油井算中间算以条边,然后进行匹配,看看两两之间最多能匹配多少对。

     

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    using namespace std;
    #define INF 0x3fffffff
    #define maxn 605
    int n, OilNum, k;///重构图之后顶点的个数 OilNum
    int Head[maxn];
    int maps[maxn][maxn], P[maxn];
    bool vis[maxn];
    struct Node
    {
        int e, next;
    }edge[maxn];
    void AddEdge(int s,int e)
    {
        edge[k].next = Head[s];
        edge[k].e = e;
        Head[s] = k ++;
    }
    
    bool Find(int u)
    {
        for(int i=Head[u]; i != -1; i = edge[i].next)
        {
            int v = edge[i].e;
            if(!vis[v])
            {
                vis[v] = true;
                if(P[v] == -1 || Find(P[v]))
                {
                    P[v] = u;
                    return true;
                }
            }
        }
        return false;
    }
    
    int solve()
    {
        int ans = 0;
        memset(P, -1, sizeof(P));
        for(int i=1; i<=OilNum; i++)
        {
            memset(vis, false, sizeof(vis));
            if(Find(i))
                ans ++;
        }
        return ans / 2;
    }
    
    
    int main()
    {
        int T, cas = 1;
        char str[maxn];
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d", &n);
    
            k = OilNum = 0;
            memset(Head, -1, sizeof(Head));
            memset(maps, 0, sizeof(maps));
    
            for(int i=0; i<n; i++)///读入图,并且重新标记
            {
                scanf("%s", str);
                for(int j=0; j<n; j++)
                {
                    if(str[j] == '.')
                        maps[i+1][j+1] = 0;
                    if(str[j] == '#')
                        maps[i+1][j+1] = ++OilNum;
                }
            }
    
            for(int i=1; i<=n; i++)///重新构图
            {
                for(int j=1; j<=n; j++)
                {
                    if(maps[i][j])
                    {
                        if(maps[i-1][j])
                            AddEdge(maps[i][j], maps[i-1][j]);
                        if(maps[i+1][j])
                            AddEdge(maps[i][j], maps[i+1][j]);
                        if(maps[i][j-1])
                            AddEdge(maps[i][j], maps[i][j-1]);
                        if(maps[i][j+1])
                            AddEdge(maps[i][j], maps[i][j+1]);
                    }
                }
            }
    
            printf("Case %d: %d
    ", cas ++,solve());
    
        }
        return 0;
    }
    
    /*
    3
    1 0 1
    1 0 1
    0 1 0
    */
  • 相关阅读:
    leetcode------Single Number II
    leetcode------Same Tree
    Hadoop2.x版本全分布式详细安装过程!!【原创!非抄袭!】
    Hadoop2.X版本伪分布式安装详细介绍【非抄袭,原创!】
    leetcode------Linked List Cycle II
    [转载]c# winform 获取当前程序运行根目录
    [转载]MongoDB设置访问权限、设置用户
    [转载]C#设置开机启动
    datagridview 右键选中行 并弹出菜单
    [转载]async & await 的前世今生
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4718590.html
Copyright © 2011-2022 走看看