题目链锁:http://acm.hdu.edu.cn/showproblem.php?pid=2819
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<stdio.h> #include<algorithm> #include<cmath> #include<set> #include<map> #include<queue> #include<vector> using namespace std; #define inf 0x3f3f3f3f #define eps 1e-9 #define mod 1000000007 #define FOR(i,s,t) for(int i = s; i < t; ++i ) #define REP(i,s,t) for( int i = s; i <= t; ++i ) #define LL long long #define ULL unsigned long long #define pii pair<int,int> #define MP make_pair #define lson id << 1 , l , m #define rson id << 1 | 1 , m + 1 , r #define maxn ( 100+10 ) #define maxe ( 50000+10 ) vector< int > G[maxn]; int link[maxn]; bool vis[maxn]; int n; bool dfs ( int u ) { for( int i = 0; i < G[u].size(); ++i ) { int v = G[u][i]; if( !vis[v] ) { vis[v] = 1; if( link[v] == -1 || dfs ( link[v] ) ) { link[v] = u; return 1; } } } return 0; } int hungary () { memset( link, -1, sizeof( link ) ); int res = 0; for( int i = 1; i <= n; ++i ) { memset( vis, 0, sizeof( vis ) ); if( dfs ( i ) ) ++res; } return res; } int ll[maxn], rr[maxn]; int main () { while( ~scanf("%d", &n ) ){ int x; for( int i = 1; i <= n; ++i ) G[i].clear(); for( int i = 1; i <= n; ++i ) for( int j = 1; j <= n; ++j ) { scanf("%d", &x ); if( x ) G[i].push_back( j ); } int ans = hungary( ); if( ans < n ) { puts("-1"); continue; } ans = 0; for( int i = 1; i <= n; ++i ) { int v ; for( v = 1; v <= n; ++v ) if( link[v] == i ) break; if( v == i ) continue; ll[ans] = i, rr[ans++] = v; swap( link[v], link[i] ); // 注意交换列之后link也要更新 } printf("%d\n", ans ); for( int i = 0; i < ans; ++i ) printf("C %d %d\n", ll[i], rr[i] ); } }