HDU5961 传递(bfs)

来源:互联网 发布:服务器软件下载 编辑:程序博客网 时间:2024/05/22 19:48

题意:中文题。。

思路:要满足a -> b, b -> c且有a -> c的一条路,即图里面从任意点出发,没有长度大于1的路径长度,对每个点bfs一次,如果有长度大于1的路,就不是,直接返回


#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<algorithm>typedef long long ll;const int maxn = 2017;const int INF = 1e9;const int mod = 1e8 + 7;using namespace std;vector<int> G[maxn];vector<int> g[maxn];char s[maxn][maxn];char vis[maxn];int n, T;bool bfs(int u, vector<int> G[maxn]) {    memset(vis, 0, sizeof(vis));    vis[u] = 1;    queue<int> q; q.push(u);    while(!q.empty()) {        int v = q.front(); q.pop();        for(int i = 0; i < G[v].size(); i++) {            int nxt = G[v][i];            if(vis[nxt]) continue;            if(v != u) return false;            vis[nxt] = 1; q.push(nxt);        }    }    return true;}int main() {    scanf("%d", &T);    while(T--) {        int l1 = 1, l2 = 1;        scanf("%d", &n);        for(int i = 0; i < n; i++) scanf("%s", s[i]);        for(int i = 0; i < maxn; i++) {            g[i].clear();            G[i].clear();        }        for(int i = 0; i < n; i++) {            for(int j = 0; j < n; j++) {                if(s[i][j] == 'P') G[i].push_back(j);                if(s[i][j] == 'Q') g[i].push_back(j);            }        }        for(int i = 0; i < n; i++) {            if(!bfs(i, G)) { l1 = 0; break; }            if(!bfs(i, g)) { l2 = 0; break; }        }        if(l1 && l2) puts("T");        else puts("N");    }    return 0;}


0 0