題意:每個格子有不同顏色的氣球用不同數字表示,每次可選某一行 或某一列來戳氣球。每個人有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());