程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1498 50 years, 50 colors (行列匹配+最小頂點覆蓋)

HDU 1498 50 years, 50 colors (行列匹配+最小頂點覆蓋)

編輯:C++入門知識

題意:每個格子有不同顏色的氣球用不同數字表示,每次可選某一行              或某一列來戳氣球。每個人有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?'\n':' ');  
        }  
        if(!flag)  
            printf("-1\n");  
    }  
    return 0;  
}  

 

    積累: 對vector中的元素排序: 頭文件#include<algorithm> vector<int> arr; //輸入數據 sort(arr.begin(),arr.end());  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved