解题思路
如果a数组全部>0,那么都不去即可。从这个角度出发,每次选出a[i]为0的,让它们去更新a数组,相当于拓补排序。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 105;
int n,a[MAXN][MAXN],re[MAXN];
int cnt,ans[MAXN];
bool vis[MAXN];
queue<int> Q;
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++){
char ch[MAXN];
scanf("%s",ch+1);
for(register int j=1;j<=n;j++){
int x=ch[j]-'0';
a[i][j]=x;
}
}
for(register int i=1;i<=n;i++){
scanf("%d",&re[i]);
if(re[i]==0){Q.push(i);vis[i]=1;ans[++cnt]=i;}
}
if(Q.empty()) {puts("0");return 0;}
while(Q.size()){
int x=Q.front();Q.pop();
for(register int i=1;i<=n;i++)if(!vis[i])
if(a[x][i]==1) {
re[i]--;
if(re[i]==0) {
vis[i]=1;
Q.push(i);
ans[++cnt]=i;
}
}
}
printf("%d\n",cnt);
for(register int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
return 0;
}