ZOJ2193 AOV建模
阅读原文时间:2023年07月14日阅读:1

每个窗口有四个小区域组成,那么不断往前递推,到达打开当前窗口时必然是那些在上面出现的窗口都已经被打开过了,那么我们可以认为是在第i个窗口的位置上出现了

j , 那么in[i]++ , 只有 i 入度为0时,才说明第i 个窗口上的所有数字对应的窗口已经出现了不用再考虑了,然后建好了AOV网络模型,我们直接判断是否有环就可以了

#include
#include
#include
#include
using namespace std;
#define N 1005

int first[] , in[] , num[][] , k , vis[][];
char s1[N] , s2[N];

struct Node
{
int y , next;
}node[N<<];

void add_edge(int x,int y)
{
in[y]++;
node[k].y = y , node[k].next = first[x];
first[x] = k++;
}

void init()
{
memset(vis,,sizeof(vis));
for(int i= ; i<= ;i++) vis[i][i] = ;
k = ;
for(int i= ; i<= ; i++){
int t = i-;
int u = t% , v = t/;
if(!vis[num[v+][u+]][i]){
add_edge(num[v+][u+] , i);
vis[num[v+][u+]][i] = ;
}
if(!vis[num[v+][u+]][i]){
add_edge(num[v+][u+] , i);
vis[num[v+][u+]][i] = ;
}
if(!vis[num[v+][u+]][i]){
add_edge(num[v+][u+] , i);
vis[num[v+][u+]][i] = ;
}
if(!vis[num[v+][u+]][i]){
add_edge(num[v+][u+] , i);
vis[num[v+][u+]][i] = ;
}
}
}

bool dag(int n)
{
stack s;
for(int i = ; i<=n ; i++){
if(!in[i])
s.push(i);
}
for(int i = ; i<n ; i++){
if(s.empty()){
return false;
}
int u = s.top();
s.pop();
for(int i=first[u] ; i!=- ; i=node[i].next){
int v = node[i].y;
in[v]--;
if(!in[v]) s.push(v);
}
}
return true;
}

int main()
{
// freopen("a.in" , "rb" , stdin);

 while(~scanf("%s",s1)){  
     if(strlen(s1) > ) break;

     memset(first , - , sizeof(first));  
     memset(in ,  , sizeof(in));

     for(int i= ; i<= ; i++)  
         for(int j= ; j<= ; j++){  
             scanf("%d",&num\[i\]\[j\]);  
         }

     init();

     if(dag()) puts("THESE WINDOWS ARE CLEAN");  
     else puts("THESE WINDOWS ARE BROKEN");

     scanf("%s",s2);  
 }  
 return ;  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章