CF 549B Looksery Party

题面

解题思路

如果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;
}

猜你喜欢

转载自blog.csdn.net/qq_40448823/article/details/81098565