麻烦哪位巨佬帮我看看,为什么改了成百上千次还是RE,一直RE
QAQ好无助……
题目 猫猫小游戏1(gameone)
题目描述
俨俨有一个 $n\times n$ 的网格,每个格子有一个颜色,初始都为无色。
俨俨喜欢花花绿绿的东西,因此它要对这个网格进行染色。它有两种染色方法:
- 任选一行,把该行的格子全部染成红色。
- 任选一列,把该列的格子全部染成绿色。
俨俨可以无限次的采用上述方法进行染色,新的染色会覆盖以前的染色效果。
$Smeow$ 对俨俨提出了多次询问,每次询问给出一张 $n\times n$ 的染过色的网格,保证每个格子都有颜色。俨俨需要回答,它能否采取上述染色方法,使得一个 $n\times n$ 的无色网格染成 $Smeow$ 给出的染色网格?
输入格式
第一行读入一个整数 $T$ ,表示询问的次数。
接下来会读入 $T$ 组数据:
- 每组数据的第一行是一个整数 $n$ ,表示网格是$n\times n$的。
- 接下来 $n$ 行,每行一个字符串,第 $i$ 行第 $j$ 个字符表示第 $i$ 行第 $j$ 列网格的颜色,为 $0$ 表示红色,为 $1$ 表示绿色,没有其他字符。
输出格式
对于每组数据输出一行一个字符串,若俨俨能够成功染色出该网格,则输出Yes,否则输出No。
样例 #1
样例输入 #1
3
1
1
2
10
01
2
11
01
样例输出 #1
Yes
No
Yes
样例 #2
样例输入 #2
3
3
111
000
111
3
101
111
000
3
100
000
001
样例输出 #2
Yes
Yes
No
数据范围与约定
对于 $50%$ 的数据, $T\le10,n\le9$
对于 $70%$ 的数据, $T\le10,n\le50$
对于 $100%$ 的数据, $T\le10,n\le1000$
我的代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int N=1013;
int head[2*N],indeg[2*N];
int tot=0,T,n;
struct edge{
int to;
int nxt;
}e[N*N*4];
void add(int u,int v){
e[++tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}
bool judge(int n,vector<string>& grid){
tot=0;
for (int i=1;i<=2*n;i++){
head[i]=indeg[i]=0;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
if (grid[i-1][j-1]=='0'){
add(i,n+j);
indeg[n+j]++;
}
else {
add(n+j,i);
indeg[i]++;
}
}
queue <int> q;
int cnt=0;
for (int i=1;i<=n*2;i++){
if (indeg[i]==0) q.push(i);
}
while (!q.empty()){
int u=q.front();
q.pop();
cnt++;
for (int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
indeg[v]--;
if (indeg[v]==0) q.push(v);
}
}
return cnt==2*n;
}
int main(){
// freopen("gameone_ex.in","r",stdin);
// freopen("gameone_ex.out","w",stdout);
cin>>T;
while(T--){
cin>>n;
vector <string> grid(n);
for (int i=0;i<n;i++)
cin>>grid[i];
if (judge(n,grid)) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}