UVa11138 - Nuts and Bolts(二分匹配)
2014-09-08 16:20
423 查看
One afternoon your cell phone rings; it's your cousin Jimmy.
"Hi Cuz," he says, "I need your help and I need it fast. I'm in the middle of a programming contest and however hard I try, I can't get one problem to finish within the two second time limit."
"Hmm... well..., isn't that a bit illegal?", you try to say to him. But he rattles on.
"I just snook out of the contest room and managed to send you my code and the sample I/O by email", he continues without pausing. "I will check my mail again in an hour, so please make it work for me."
"What about the problem description?", you ask.
"Can't do", he says, "Zoroman the Head Judge is already on my tail, so I got to go. Bye, ... and, eh, thanks."
Are you going to help him?
This is the code that Jimmy sent you by email.
A plain-text version can be found
here.
"Hi Cuz," he says, "I need your help and I need it fast. I'm in the middle of a programming contest and however hard I try, I can't get one problem to finish within the two second time limit."
"Hmm... well..., isn't that a bit illegal?", you try to say to him. But he rattles on.
"I just snook out of the contest room and managed to send you my code and the sample I/O by email", he continues without pausing. "I will check my mail again in an hour, so please make it work for me."
"What about the problem description?", you ask.
"Can't do", he says, "Zoroman the Head Judge is already on my tail, so I got to go. Bye, ... and, eh, thanks."
Are you going to help him?
Jimmy's Code
#include <stdio.h> #define MAX_BOLTS 500 #define MAX_NUTS 500 /* global copy of the input data */ int nuts,bolts; int fits[MAX_BOLTS][MAX_NUTS]; void read_input_data(void){ int n,b; scanf("%d%d",&bolts,&nuts); for(b=0;b<bolts;b++){ for(n=0;n<nuts;n++){ scanf("%d",&fits[b] ); } } } /* data used to match nuts with bolts */ int nut_used[MAX_NUTS]; int bestmatched; void init_match(void){ int n; bestmatched=0; for(n=0;n<nuts;n++) nut_used =0; } void match_bolt(int boltno, int matched){ int n; if(boltno==bolts){ if(matched>bestmatched) bestmatched=matched; return; } /* don't match this bolt */ match_bolt(boltno+1,matched); /* match with all unused nuts that fit this bolt */ for(n=0;n<nuts;n++) if(!nut_used && fits[boltno] ){ nut_used =1; match_bolt(boltno+1,matched+1); nut_used =0; } } int main(){ int cases,caseno; scanf("%d",&cases); for(caseno=1;caseno<=cases;caseno++){ read_input_data(); init_match(); match_bolt(0,0); printf("Case %d: ",caseno); printf("a maximum of %d nuts and bolts ",bestmatched); printf("can be fitted together\n"); } return 0; } |
A plain-text version can be found
here.
Sample Input
2 3 4 0 0 1 0 1 1 0 1 0 0 1 0 5 5 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1
Sample Output
Case 1: a maximum of 2 nuts and bolts can be fitted together Case 2: a maximum of 5 nuts and bolts can be fitted together
import java.io.FileInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.io.PrintWriter; import java.io.OutputStreamWriter; import java.util.Arrays; public class Main implements Runnable{ private static final boolean DEBUG = false; private BufferedReader cin; private PrintWriter cout; private StreamTokenizer tokenizer; private int bolts, nuts; private boolean[] vis; private int[] My; private int[][] g; private void init() { try { if (DEBUG) { cin = new BufferedReader(new InputStreamReader( new FileInputStream("d:\\OJ\\uva_in.txt"))); } else { cin = new BufferedReader(new InputStreamReader(System.in)); } tokenizer = new StreamTokenizer(cin); cout = new PrintWriter(new OutputStreamWriter(System.out)); } catch (Exception e) { e.printStackTrace(); } } private String next() { try { tokenizer.nextToken(); if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null; else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) { return String.valueOf((int)tokenizer.nval); } else return tokenizer.sval; } catch (Exception e) { e.printStackTrace(); return null; } } private boolean input() { bolts = Integer.parseInt(next()); nuts = Integer.parseInt(next()); g = new int[bolts][nuts]; for (int i = 0; i < bolts; i++) { for (int j = 0; j < nuts; j++) { g[i][j] = Integer.parseInt(next()); } } return true; } private boolean find(int x) { for (int y = 0; y < nuts; y++) { if (!vis[y] && g[x][y] != 0) { vis[y] = true; if (My[y] == -1 || find(My[y])) { My[y] = x; return true; } } } return false; } private void solve(int cas) { My = new int[nuts]; Arrays.fill(My, -1); vis = new boolean[nuts]; int ans = 0; for (int i = 0; i < bolts; i++) { Arrays.fill(vis, false); if (find(i)) ans++; } cout.println("Case " + cas + ": a maximum of " + ans + " nuts and bolts can be fitted together"); cout.flush(); } public void run() { init(); int t = Integer.parseInt(next()); for (int i = 1; i <= t; i++){ input(); solve(i); } } public static void main(String[] args) { new Thread(new Main()).start(); } }
相关文章推荐
- uva 11138 - Nuts and Bolts(二分匹配)
- UVA 12530 Game of Tiles(二分匹配)#by zh
- UVA 663 Sorting Slides(二分匹配)
- UVa live6492Welcome Party(二分最大匹配之最小点覆盖)
- UVa 1663 Purifying Machine (二分匹配)
- Uva12880(二分匹配)
- UVA 11419 SAM I AM 二分匹配最小覆盖点
- UVa 1663 - Purifying Machine(二分匹配)
- UVALive 6198 A Terribly Grimm Problem 二分匹配 求字典序最小解
- uva 10122 Mysterious Mountain and ZOJ 1231 Mysterious Mountain (二分+二部图最大匹配)
- UVa live6525Attacking rooks(二分最大匹配之最大匹配)
- UVALive 6525 Attacking rooks 二分匹配 经典题
- uva 10122 Mysterious Mountain and ZOJ 1231 Mysterious Mountain (二分+二部图最大匹配)
- Guardian of Decency UVA - 12083 (二分匹配)
- uva 12549 Sentry Robots 最大二分匹配
- 【二分匹配】 UVALive 6525 Attacking rooks
- UVALive 6525 Attacking rooks 二分匹配 经典题
- 【二分匹配】 UVALive 6525 Attacking rooks
- UVA5874 Social Holidaying 二分匹配
- UVa live3415Guardian of Decency(二分最大匹配之最大独立点集)