luo's oj p1735 图XM

题目链接

分析

首先满足题目要求原图G必须是DAG,然后可以得到蓝图中(u,w),(w,v)一定存在(u,v)在红图中一定没有(v,u)(u,v),所以只要把其中的一个图的边全部取反,在判断一次DAG就可以了(用拓扑判断是否是DAG)
注意多组数据要初始化,WA了2次

#include<bits/stdc++.h>
#define N 2020
using namespace std;
int a[N][N],p[N][N],in[N],n; 
bool bfs(){
    int cnt=0;queue<int>q;
    for(int i=1;i<=n;i++)
        if(!in[i])q.push(i);
    while(!q.empty()){
        int u=q.front();q.pop();
        cnt++;
        for(int v=1;v<=n;v++)
            if(a[u][v]){
                in[v]--;
                if(!in[v])q.push(v); 
            }
    }
    return cnt==n;
}
void deg(){
    memset(in,0,sizeof(in));
    for(int u=1;u<=n;u++)
        for(int v=1;v<=n;v++)
            if(p[u][v]){
                a[u][v]=0;
                a[v][u]=1;
            }
    for(int u=1;u<=n;u++)
        for(int v=1;v<=n;v++)
            if(a[u][v])in[v]++;
}
int main(){
    int T;scanf("%d",&T); 
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                a[i][j]=p[i][j]=0;
        memset(in,0,sizeof(in));    
        char s[n+1];
        for(int i=1;i<=n;i++){
            scanf("%s",s+1);
            int len=strlen(s+1);
            for(int j=1;j<=len;j++)
                if(s[j]=='U')a[i][j]=0;
                else{
                    a[i][j]=1;
                    in[j]++;
                    if(s[j]=='R')p[i][j]=1;
                }
        }
        int s1=bfs();
        deg();
        int s2=bfs();
        if(s1&&s2)puts("T");
        else puts("N");
    }    
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_36316033/article/details/80963386
OJ
今日推荐