PAT-A-1139 First Contact

题意

要求找到所有从A到D的所有A-B-C-D关系,要求A与B同性别,C与D同性别,且他们相邻之间为朋友关系。

分析

读入后在朋友关系间建图,然后做一个4层约束较强的深搜,注意此题容易出错的点有:

  • 有一个测试样例有 -0000的数据,注意读入时需要判断
  • 注意在dfs时,要防止A、D间重复出现的情况,不加约束容易出现A-D-A-DA-B-A-D等错误解
#include
using namespace std;
typedef pair<int, int> pii;
const int N = 1e4+5;
vector<int> e[N];
bool clr[N];
int n, m, q;
int st, ed;
pii frd;
vector ans;
inline pii read(){
    pii ret; char ch;
    while(ch=getchar(), isspace(ch));
    if(ch == '-') ret.second = 1; else ret.first = ch&15;
    while(ch=getchar(), isdigit(ch)) ret.first = ret.first*10 + (ch&15);
    return ret;
}
void dfs(int u, int dep){
    for(auto v: e[u]){
        if(dep == 2 && v == ed){ans.push_back(frd); continue;}
        if(v == st || v == ed) continue;
        if(dep == 0 && clr[v]^clr[st]) continue;
        if(dep == 1 && clr[v]^clr[ed]) continue;
        if(dep == 0) frd.first = v;
        else if(dep == 1) frd.second = v;
        else continue;
        dfs(v, dep+1);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; i++){
        pii u = read(); pii v = read();
        clr[u.first] = u.second; clr[v.first] = v.second;
        e[u.first].push_back(v.first);
        e[v.first].push_back(u.first);
    }
    scanf("%d", &q);
    for(int i = 1; i <= q; i++){
        ans.clear();
        scanf("%d%d", &st, &ed);
        st = abs(st); ed = abs(ed);
        dfs(st, 0);
        sort(ans.begin(), ans.end());
        int len = unique(ans.begin(), ans.end()) - ans.begin();
        printf("%d\n", len);
        for(int i = 0; i < len; i++)
            printf("%04d %04d\n", ans[i].first, ans[i].second);
    }
    return 0;
}

你可能感兴趣的:(算法)