AC 代码(1):
#include<iostream>
using namespace std;
#include<string>
#include<queue>
#include<cstring>
const int N=10010;
int status[N];
int T,n;
struct Pro{
int num; //发给谁
int op; //0:发送 1:接收
Pro(){
}
Pro(int nn,int oo)
{
num=nn;
op=oo;
}
};
queue<Pro> q[N];
int run(int i)
{
status[i]=1;
int ne=q[i].front().num;
if(!q[ne].size() || status[ne]==1) //下个进程无命令或者形成环
return 0;
if(q[i].front().op!=q[ne].front().op && q[ne].front().num==i) //满足消除条件
{
q[i].pop();
q[ne].pop();
status[i]=0;
memset(status,0,sizeof(status)); //注意每次成功后都会重新递归,status函数要初始化
return 1;
}
return run(ne); //也可以直接用while替代递归
}
int main()
{
cin>>T>>n;
getchar();
while(T--)
{
memset(status,0,sizeof(status));
for(int i=0;i<n;i++)
q[i]=queue<Pro>();
string str;
for(int u=0;u<n;u++)
{
getline(cin,str);
string xx; //可以直接sscanf
for(int i=0;i<str.size();i++) //每个i,j借一个Pro
{
int j=i;
while(j<str.size()&&str[j]!=' ')
j++;
xx=str.substr(i,j-i);
int num=0;
for(int k=1;k<xx.size();k++)
{
num*=10;
num+=(xx[k]-'0');
}
q[u].push(Pro(num,xx[0]=='S'?0:1));
i=j;
}
}
int yes=1;
for(int i=0;i<n;i++)
{
if(q[i].size() && !run(i))
{
yes=0;
break;
}
if(q[i].size())
i--;
}
if(!yes)
puts("1");
else puts("0");
}
return 0;
}
AC 代码(2):
#include<iostream>
using namespace std;
#include<string>
#include<queue>
#include<cstring>
#include<sstream>
const int N=10010;
int status[N];
int T,n;
struct Pro{
int num; //发给谁
int op; //0:发送 1:接收
Pro(){
}
Pro(int nn,int oo)
{
num=nn;
op=oo;
}
};
queue<Pro> q[N];
int dfs(int i)
{
int now;
int ne=i;
while(1)
{
now=ne;
status[now]=1;
ne=q[now].front().num;
if(!q[ne].size() || status[ne]==1)
return 0;
if((q[now].front().op!=q[ne].front().op) && q[ne].front().num==now)
{
status[now]=0;
status[ne]=0;
q[now].pop();
q[ne].pop();
memset(status,0,sizeof(status));
return 1;
}
}
}
int main()
{
cin>>T>>n;
getchar();
while(T--)
{
memset(status,0,sizeof(status));
for(int i=0;i<n;i++)
q[i]=queue<Pro>();
string str;
for(int u=0;u<n;u++)
{
getline(cin,str);
stringstream ssin(str);
while(ssin>>str)
{
if(str[0]=='S')
q[u].push(Pro(stoi(str.substr(1)),0));
else q[u].push(Pro(stoi(str.substr(1)),1));
}
}
int yes=1;
for(int i=0;i<n;i++)
{
if(q[i].size() && !dfs(i))
{
yes=0;
break;
}
if(q[i].size())
i--;
}
if(!yes)
puts("1");
else puts("0");
}
return 0;
}