题目:给你一个n*n的矩阵,你有一把贯穿型的毁灭武器,一发可以整行或整列的小行星射得灰飞湮灭,问最少射多少发把所有行星射掉
吐槽:看到这么多点,边不是很多,然后改邻接表,后来发现,时间也差不多。
/************************************************ Author :DarkTong Created Time :2016/7/31 17:00:15 File Name :Poj_2538.cpp *************************************************/ //#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 500 + 10; //int w[maxn][maxn]; vector<int> w[maxn]; int n, m; int Left[maxn]; bool used[maxn]; bool match(int j) { for(int i=0;i<w[j].size();++i) if(!used[w[j][i]]) { int v = w[j][i]; used[v] = true; if(!Left[v]||match(Left[v])) { Left[v] = j; return true; } } return false; } //返回最大匹配数 int hungary() { int res=0; memset(Left, 0, sizeof(Left)); for(int i=1;i<=m;++i) { memset(used, 0, sizeof(used)); if(match(i)) res++; } return res; } int main() { int T, cas=1, k; while(scanf("%d%d", &n, &k)==2) { // memset(w, 0, sizeof(w)); for(int i=1;i<maxn;++i) w[i].clear(); m=n; int u, v; for(int i=1;i<=k;++i) { scanf("%d%d", &u, &v); // w[u][v]=1; w[v].push_back(u); } printf("%d\n", hungary()); } return 0; }
时间: 2024-10-25 01:05:54