图XM

题目描述
给定一张竞赛图,即n个点的完全图把每条边定向后得到的有向图。每条边有可能是红的也有可能是蓝的。你需要判断:对于红色边构成的图和蓝色边构成的图,
是否都满足条件:若存在边(u,v)(v, w),则一定存在边(u,w)。

输入 输入文件为graph.in。 第一行一个整数T表示数据组数。
对于每组数据,第一行一个整数n表示点数。接下来n行,每行n个数。第i行第j个数aij。若aij为U表示i到j没有边。aij为R表示(i,j)是红色的。aij为B表示(i,j)是蓝色的。
输出 输出文件为graph.out。 输出共T行。对于每组数据,满足条件输出T,否则输出N。
样例输入
2 4
URUU
UUUU
BRUR
BRUU
4
UUBB
RURU
UUUU
URBU
样例输出
T
N
提示
对于30%的数据,满足n<=200。

对于60%的数据,满足n<=800。

对于100%的数据,满足1<=T<=5, 1<=n<=2016。

由于是完全图,如果一种颜色存在(u,v)的边,则另一种颜色一定不存在(u,v)或(v,u)的边,所以我们只需判断原图是否是DAG,在把某一颜色的边取反,在判断DAC即可(仔细思考即可得到)。

var
t,i,n,j,tot:longint;
flag,head:array[0..2022] of longint;
ret,next:array[0..4500044] of longint;
f:boolean;
a:array[0..2022,0..2022] of char;
procedure ins(u,v:longint);
begin
  tot:=tot+1;
  ret[tot]:=v;
  next[tot]:=head[u];
  head[u]:=tot;
end;

procedure dfs(u:longint);
var
i,v:longint;
begin
  flag[u]:=1;
  i:=head[u];
  while i<>0 do
  begin
    v:=ret[i];
    if flag[v]=0 then dfs(v)
                 else if flag[v]=1 then begin f:=false; exit; end;
    if f=false then exit;
    i:=next[i];
  end;
  flag[u]:=2;
end;

begin
  readln(t);
  while t>0 do
  begin
    t:=t-1;
    fillchar(head,sizeof(head),0);
    tot:=0;
    readln(n);
    for i:=1 to n do
    begin
      for j:=1 to n do
      begin
        read(a[i,j]);
        if a[i,j]<>'U' then ins(i,j);
      end;
      readln;
    end;
    fillchar(flag,sizeof(flag),0);
    f:=true;
    for i:=1 to n do
      if flag[i]=0 then dfs(i);
    if f=false then begin writeln('N'); continue; end;
    tot:=0;
    fillchar(head,sizeof(head),0);
    fillchar(flag,sizeof(flag),0);
    for i:=1 to n do
      for j:=1 to n do
      begin
        if a[i,j]='R' then
          ins(i,j);
        if a[i,j]='B' then
          ins(j,i);
      end;
    for i:=1 to n do
      if flag[i]=0 then dfs(i);
    if f=false then writeln('N')
               else writeln('T');
  end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值