zoukankan      html  css  js  c++  java
  • HDU 1498 50 years, 50 colors (行列匹配+最小顶点覆盖)

    题目:点击打开链接

    题意:每个格子有不同颜色的气球用不同数字表示,每次可选某一行

                 或某一列来戳气球。每个人有K次机会。求最后哪些气球不能在

                k次机会内被戳破。将这些气球的编号按升序输出。

    分析:行列匹配,每种颜色的气球都要判断,故dfs传参时加一个气球的

                 编号。

    感想:1、开始以为要按照最大匹配数按升序排列,昨天wa了一下午,把我搞郁闷了。

                        今天重新看题,是要按照id来排序。

                 2、学习了vector的用法,以前都不会用。。。这个之后汇总了再。。。


    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    struct node
    {
        int id;
        int cnt;
    }t[55];
    int g[110][110];
    int match[110];
    int vis[110];
    int n;
    vector<int> myv;
    
    bool cmp(node a,node b)
    {
        return a.cnt>b.cnt;
    }
    bool dfs(int u,int v)
    {
        for(int i=0;i<n;i++)
        {
            if(g[u][i]==v && !vis[i])
            {
                vis[i]=true;
                if(match[i]==-1||dfs(match[i],v))
                {
                    match[i]=u;
                    return true;
                }
            }
        }
        return false;
    }
    int main()
    {
        int k,i,p,flag,j;
        while(scanf("%d%d",&n,&k)&&n&&k)
        {
            flag=0;
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                    scanf("%d",&g[i][j]);
            }
            memset(t,0,sizeof(t));
            for(p=1;p<=50;p++)
            {
                memset(match,-1,sizeof(match));
                t[p].id=p;
                for(i=0;i<n;i++)
                {
                    memset(vis,0,sizeof(vis));
                    if(dfs(i,p))
                        t[p].cnt++;
                }
            }
            sort(t+1,t+51,cmp);
            myv.clear();
            for(j=1;j<=50;j++)
            {
                if(t[1].cnt<=k)
                    break;
                flag=1;
                if(t[j].cnt>k)
                    myv.push_back(t[j].id);
            }
            sort(myv.begin(),myv.end());
            if(flag)
            {
                for(i=0;i<myv.size();i++)
                     printf("%d%c",myv[i],i==myv.size()-1?'
    ':' ');
            }
            if(!flag)
                printf("-1
    ");
        }
        return 0;
    }
    

    积累:

    对vector中的元素排序:

    头文件#include<algorithm>
    vector<int> arr;
    //输入数据
    sort(arr.begin(),arr.end());
    


  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3290149.html
Copyright © 2011-2022 走看看