hdu5961

来源:互联网 发布:mac 音频剪辑 编辑:程序博客网 时间:2024/05/16 03:38
/*hdu5691 图的传递性~~~~假如a是b的父亲节点,b是c的父亲节点,那么a就一定要是c的父亲节点,则是传递。假如 a 连接b,c,d, 则b连接c 他们是传递,假如b连接 e 则就不是传递了,这个传递的性质搞清楚就好了,唉~~~对着图看半天看不懂。后来还是搜题解看懂的。阿洗吧~~~看完题解 这就很水了 。好尴尬~~~~~~~~~~~用bfs 判断层次,如果 层次大于1 则不传递了。想想 也是的~*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<queue>using namespace std;#define MAX 2020#define INF 999999999vector<int>p[MAX];vector<int>q[MAX];struct node{    int x,step;};int n;char a[2030];int vis[2030];int jude()//判{    for(int i=1;i<=n;i++)    {        memset(vis,0,sizeof(vis));        queue<node>q;        node a={i,0};        q.push(a);        while(!q.empty())        {            a=q.front();            q.pop();            if(a.step>=2) return 0;            for(int i=0;i<p[a.x].size();i++)            {             int    v=p[a.x][i];                if(!vis[v])                {                    vis[v]=1;                    node b={v,a.step+1};                    q.push(b);                }            }        }    }    return 1;}int jude2(){    for(int i=1;i<=n;i++)    {        memset(vis,0,sizeof(vis));        queue<node>q1;        node a={i,0};        q1.push(a);        while(!q1.empty())        {            a=q1.front();            q1.pop();            if(a.step>=2) return 0;            for(int i=0;i<q[a.x].size();i++)            {                int v=q[a.x][i];                if(!vis[v])                {                    vis[v]=1;                    node b={v,a.step+1};                    q1.push(b);                }            }        }    }    return 1;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            p[i].clear();            q[i].clear();        }        for(int i=1;i<=n;i++)        {            scanf("%s",a+1);            for(int j=1;j<=n;j++)            {                if(a[j]=='P')                {                    p[i].push_back(j);                }                if(a[j]=='Q')                {                    q[i].push_back(j);                }            }        }        if(jude()&&jude2()) printf("T\n");        else printf("N\n");    }}