思路:經典二分圖建圖模型, 對於每一個格子, 按照行標建一列, 列標建一列, 然後進行匹配即可, 然後嘗試刪除每條邊, 再進行匹配看看有沒有比原匹配小。 細節參見代碼:
#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; }
C語言中的程序結構,C語言程序結構C語言中的程序結構有三種,
C#開發WPF/Silverlight動畫及游戲系列教程(
如何擴展的呢,很簡單,這裡使用了 params 這個“方法
Objective-C Runtime機制詳解 Obje
環境:win7 IDE:DEV-C++ 編譯器:GCC 編譯
最近對GDI+這個東西接觸的比較多,也做了些簡單的實例,比