HDU --- 5961 传递 【思维 + bfs】

来源:互联网 发布:学生证办理 淘宝 编辑:程序博客网 时间:2024/06/02 06:43

传送门
//题意: 给你两幅图, 为是否都是竞赛图. 竞赛图的定义题目中给出了的.
//思路 : 比赛的时候没开 . 因为比赛想的是暴力, 不敢动. 下来看了下正解, 用bfs, 不可能会出现深度>=2的, 出现了就不是, 否则就是. 只能说想法太好了, 我怎么就想不到了. 太菜了…
//注意的就是如何简化代码量, 因为有两幅图, 但是最好只写一个bfs最好, 避免写的丑. 所以要多多学习!!!
我用的是一个二维二维vector, 这样每次改变下第二维的数字就行了.

AC Code

/** @cain*/const int maxn=2016+5;int n;char s[maxn][maxn];vector<int >v[maxn][2];  //0是一幅图, 1是一幅图. 这样代码量就会简化不少.bool vis[maxn];struct node{    int val,step;    node(int val=0,int step=0):val(val),step(step){}};bool bfs(int x,int flag){    queue<node >q;    q.push(node{x,0});    vis[x] = true;    while(!q.empty()){        node tmp = q.front();        if(tmp.step>=2) return false;        q.pop();        for(int i=0;i<v[tmp.val][flag].size();i++){            int to = v[tmp.val][flag][i];            if(vis[to]) continue;            vis[to] = true;            q.push(node{to,tmp.step+1});        }    }    return true;}void solve(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);    for(int i=1;i<=n;i++){        v[i][0].clear();        v[i][1].clear();    }    for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++){            if(s[i][j] == 'P') v[i][0].push_back(j);            if(s[i][j] == 'Q') v[i][1].push_back(j);        }    }    bool flag1,flag2;    for(int i=1;i<=n;i++){        Fill(vis,false); flag1 = bfs(i,0);        Fill(vis,false); flag2 = bfs(i,1);        if(!flag1 || !flag2){            printf("N\n");            break;        }    }    if(flag1 && flag2) printf("T\n");}
原创粉丝点击