思路
- 拓扑排序,从入度为0的节点开始,逐步查看这个节点是哪些节点的输入,并进行计算即可
- 如果最后仍然存在入度非0的点,说明存在环
- 本题使用邻接矩阵进行计算,注意矩阵别开太大,否则空间占据过大会扣分
- 注意何时初始化邻接矩阵和图节点信息
代码
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
const int MaxN=510;
int graph[MaxN][MaxN]={0};
string type[MaxN]={""};
int deg[MaxN]={0};
int res[MaxN]={0};
int strToInt(string s){
int res=0;
for(int i=0;i<s.length();i++){
if(s[i]>='0' && s[i]<='9'){
res=res*10+s[i]-'0';
}
}
return res;
}
bool cal(vector<int> input,int M,int N){
bool result=true;
queue<int> q;
int read[MaxN]={0};
memset(res,0,sizeof(res));
int indeg[MaxN]={0};
for(int i=0;i<M+N;i++){
indeg[i]=deg[i];
if(i<M)
res[i]=input[i];
if(indeg[i]==0){
q.push(i);
read[i]=1;
}
}
int flag[MaxN]={0};
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=M;i<M+N;i++){
if(graph[i][u]==1){
indeg[i]--;
if(flag[i]==0){
res[i]=res[u];
if(type[i]=="NOT")
res[i]=!res[u];
flag[i]=1;
}
else{
if(type[i]=="AND" || type[i]=="NAND")
res[i] &=res[u];
else if(type[i]=="OR" || type[i]=="NOR")
res[i] |=res[u];
else if(type[i]=="XOR"){
res[i] ^=res[u];
}
}
}
if(indeg[i]==0 && read[i]==0){
q.push(i);
read[i]=1;
if(type[i]=="NOR" || type[i]=="NAND"){
res[i]=!res[i];
}
}
}
}
for(int i=0;i<M+N;i++){
if(indeg[i]!=0)
return false;
}
return result;
}
int main(){
int Q=0;
cin>>Q;
while(Q--){
memset(graph,0,sizeof(graph));
memset(deg,0,sizeof(deg));
memset(res,0,sizeof(res));
int s=0;
int M=0,N=0;
cin>>M>>N;
for(int i=0;i<N;i++){
cin>>type[i+M];
cin>>s;
deg[i+M]+=s;
for(int j=0;j<s;j++){
string m;
cin>>m;
if(m[0]=='I'){
graph[i+M][strToInt(m)-1]=1;
}
else
graph[i+M][M+strToInt(m)-1]=1;
}
}
cin>>s;
vector< vector<int> > input;
for(int i=0;i<s;i++){
vector<int> temp;
for(int j=0;j<M;j++){
int m=0;
cin>>m;
temp.push_back(m);
}
input.push_back(temp);
}
bool toplogy=true;
for(int i=0;i<s;i++){
toplogy=cal(input[i],M,N);
int sj=0;
cin>>sj;
for(int j=0;j<sj;j++){
int m;
cin>>m;
if(toplogy==true){
cout<<res[m+M-1]<<" ";
}
}
if(toplogy==true)
cout<<endl;
}
if(toplogy==false)
cout<<"LOOP"<<endl;
}
return 0;
}