1. 程式人生 > 實用技巧 >HDOJ 1281 棋盤遊戲

HDOJ 1281 棋盤遊戲

等我研究出來鏈式前向星的寫法再回來更新,先貼看了其他部落格的

(棋盤的長寬 為集合A 和 集合B)

為保證 車不相互打架 集合AB二分匹配

刪除其中一條邊 如果與標準的結果相同 則不是重要邊,反之sum++;

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<cstdio>
#include<queue>
typedef 
long long ll; const int mod = 1e9+7; const int maxn = 1000000; const int inf = 0x3f3f3f3f; using namespace std; int mp[202][202],n,m,k; int l[202],r[202]; int path[202]; bool vis[202]; bool dfs(int u) { for(int i=1;i<=m;i++) { if(mp[u][i]) { if(!vis[i]) { vis[i]
= true; if(path[i]==-1||dfs(path[i])) { path[i] = u; return true; } } } } return false; } int hungary() { int ret = 0; memset(path,-1,sizeof(path)); for(int i = 1;i<=n;i++) { memset(vis,
0,sizeof(vis)); if(dfs(i)) ret++; } return ret; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int cas = 1; while(cin>>n>>m>>k) { memset(mp,0,sizeof(mp)); for(int i=0;i<k;i++) { cin>>l[i]>>r[i]; mp[l[i]][r[i]] = 1; } int bz = hungary(); int ans = 0; for(int i = 0;i<k;i++) { mp[l[i]][r[i]] = 0; //刪邊 int tmp = hungary(); if(tmp != bz)ans++; //如果!= 那此邊為重要邊 mp[l[i]][r[i]] = 1; } printf("Board %d have %d important blanks for %d chessmen.\n",cas++,ans,bz); } }
View Code