hdu 5961 传递 ccpc 2016 合肥站

来源:互联网 发布:淘宝网商城婴儿童装 编辑:程序博客网 时间:2024/04/29 18:27

传送门

分析:
这道题非常有趣。。
可以这样想:
对于一个传递的图,那么对于a,b,cV,如果a>b,b>c,那么a>c。画一个图可以看出来,这个的话从一个点出发一定只有两层的深度。这很好理解。那么就bfs一下,如果搜索的深度大于2就返回false就行了。

这道题要mark一下。

代码:

/*****************************************************///#pragma comment(linker, "/STACK:1024000000,1024000000")#include <map>#include <set>#include <ctime>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define   offcin        ios::sync_with_stdio(false)#define   sigma_size    26#define   lson          l,m,v<<1#define   rson          m+1,r,v<<1|1#define   slch          v<<1#define   srch          v<<1|1#define   sgetmid       int m = (l+r)>>1#define   ll            long long#define   ull           unsigned long long#define   mem(x,v)      memset(x,v,sizeof(x))#define   lowbit(x)     (x&-x)#define   bits(a)       __builtin_popcount(a)#define   mk            make_pair#define   pb            push_back#define   fi            first#define   se            secondconst int    INF    = 0x3f3f3f3f;const ll     INFF   = 1e18;const double pi     = acos(-1.0);const double inf    = 1e18;const double eps    = 1e-9;const ll     mod    = 1e9+7;const int    maxmat = 10;const ull    BASE   = 133333331;/*****************************************************/inline void RI(int &x) {      char c;      while((c=getchar())<'0' || c>'9');      x=c-'0';      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/const int maxn = 2020;std::vector<int> P[maxn], Q[maxn];bool vis[maxn];int N;bool bfs(int s, bool on) {    queue<pair<int, int> >q;    memset(vis, false, sizeof(vis));    q.push(make_pair(s, 0)); vis[s] = true;    while (!q.empty()) {        pair<int, int> tmp = q.front(); q.pop();        int u = tmp.first, d = tmp.second;        // cout<<u<<" "<<d<<endl;        if (d >= 2) return false;        if (on) {            for (unsigned i = 0; i < P[u].size(); i ++) {                int v = P[u][i];                if (vis[v]) continue;                vis[v] = true;                q.push(make_pair(v, d + 1));            }        }        else {            for (unsigned i = 0; i < Q[u].size(); i ++) {                int v = Q[u][i];                if (vis[v]) continue;                vis[v] = true;                q.push(make_pair(v, d + 1));            }        }    }    return true;}int main(int argc, char const *argv[]) {    int T; cin>>T;    while (T --) {        scanf("%d", &N);        for (int i = 1; i <= N; i ++) {P[i].clear(); Q[i].clear();}        for (int i = 0; i < N; i ++) {            char s[maxn]; scanf("%s", s);            for (int j = 0; j < N; j ++) {                if (s[j] == 'P') P[i + 1].push_back(j + 1);                else if (s[j] == 'Q') Q[i + 1].push_back(j + 1);            }        }        bool flag = true;        for (int i = 1; i <= N; i ++) if (!bfs(i, 0)) {            flag = false; break;        }        for (int i = 1; i <= N; i ++) if (!bfs(i, 1)) {            flag = false; break;        }        if (flag) puts("T");        else puts("N");    }    return 0;}
0 0
原创粉丝点击