传送门 大~一痕奈,这个题浪费了我很长时间,要好好的总结。
1.spj就是因为答案不确定,所以会有特别的方法检验答案的正确性。
2.做题之前要好好读题,免得出现输出不符合答案规定的情况。
思路:此题的思路就是用最大值匹配,匈牙利算法,最后在模拟一遍过程(在这里浪费了很长时间(怨念))。
using namespace std;
int G[maxn][maxn], used[maxn], vis[maxn], n;
int x[maxn],y[maxn];
bool Find(int u) {
for(int i = 1 ; i <= n ; i++) {
if(!vis[i] && G[u][i]) {
vis[i] = 1;
if(used[i] == 0 || Find(used[i])) {
used[i] = u;
return true;
}
}
}
return false;
}
int main() {
int m, i, a, b, ans;
while(cin >> n) {
ans = 0;
mem(G, 0);
int cnt = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
cin >> a;
if(a)
G[i][j] = 1;
}
mem(used, 0);
for(i = 1 ; i <= n ; i++) {
mem(vis, 0);
if(Find(i))
ans++;
}
mem(x,0),mem(y,0);
if(ans < n)
cout << -1 << endl;
else {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == used[j]) {
if(i==j)break;
swap(used[i], used[j]);
//vis[i] = 1;
x[++cnt]=i,y[cnt]=j;
break;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
cout<<'C'<<' '<<x[i]<<' '<<y[i]<<endl;
}
}
return 0;
}