思路:經典二分圖建圖模型, 對於每一個格子, 按照行標建一列, 列標建一列, 然後進行匹配即可, 然後嘗試刪除每條邊, 再進行匹配看看有沒有比原匹配小。 細節參見代碼:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; typedef long double ld; const ld eps = 1e-9, PI = 3.1415926535897932384626433832795; const int mod = 1000000000 + 7; const int INF = 0x3f3f3f3f; // & 0x7FFFFFFF const int seed = 131; const ll INF64 = ll(1e18); const int maxn = 100 + 10; int T,n,m,k,tot,kase = 0; int use[maxn],from[maxn]; bool mp[maxn][maxn]; bool match(int x) { for(int i = 1; i <= m; i++) if(!use[i] && mp[x][i]) { use[i] = true; if(from[i] == -1 || match(from[i])) { from[i] = x; return true; } } return false; } int hungary(int n) { tot = 0; memset(from, -1, sizeof(from)); for(int i = 1; i <= n; i++) { memset(use, 0, sizeof(use)); if(match(i)) ++tot; } return tot; } struct node { int r, c; }a[maxn*maxn]; int main() { while(~scanf("%d%d%d",&n,&m,&k)) { memset(mp, false, sizeof(mp)); for(int i = 0; i < k; i++) { scanf("%d%d",&a[i].r,&a[i].c); mp[a[i].r][a[i].c] = true; } int init = hungary(n), ans = 0; for(int i = 0; i < k; i++) { mp[a[i].r][a[i].c] = false; int cur = hungary(n); mp[a[i].r][a[i].c] = true; if(cur < init) ++ans; } printf("Board %d have %d important blanks for %d chessmen.\n",++kase,ans,init); } return 0; }
Problem Description 時間:20
Category 書上翻譯為目錄 [系統類的擴展] (1)實
print?描述 密碼是我們生活中非常重要的東東,
ref 和 out 的區別 網上有很多這方面的文章,但是大
題目: 通過泰勒公式的變形
最近研究了一下c語言中結構體大小的