80pts 求调
查看原帖
80pts 求调
1054952
zzCX_df楼主2025/7/29 18:00
#include <bits/stdc++.h>

using namespace std;

const int N = 310000;
int t, n, m, cnta, cntb, a[N], b[N], bel[N];
vector<int> edges[N];
bool vis[N];

inline void dfs(int p) {
    bel[p] = 3;
    a[++cnta] = p;
    for (auto y : edges[p]) if (!bel[y]) 
        dfs(y);
}

int main() {
    scanf("%d", &t);
    for (; t--; ) {
        cnta = cntb = 0;
        memset(bel, 0, sizeof(bel));
        memset(vis, false, sizeof(vis));
        scanf("%d%d", &n, &m);
        if (n == 1 && m == 0) {
            puts("Yes");
            continue;
        }
        for (int i = 1; i <= n; i++)
            edges[i].clear();
        for (; m--; ) {
            int u, v;
            scanf("%d%d", &u, &v);
            edges[u].push_back(v);
            edges[v].push_back(u);
            if (u == 1) {
                bel[u] = 1;
                a[++cnta] = v;
                bel[v] = 3;
            }
            else if (v == 1) {
                bel[v] = 1;
                a[++cnta] = u;
                bel[u] = 3;
            }
        }
        for (int i = 1; i <= n; i++) if (bel[i] == 3)
            dfs(i);
        for (int i = 1; i <= n; i++) if (!bel[i]) {
            b[++cntb] = i;
            bel[i] = 2;
        }
        if (!cntb && cnta)
            puts("No");
        else {
            bool f = true;
            for (int i = 1; i <= n && f; i++) for (auto y : edges[i]) {
                if (bel[i] == 1 && bel[y] == 2) 
                    f = false;
                else if (bel[i] == 2 && bel[y] == 1) 
                    f = false;
                else if (bel[i] == 2 && bel[y] == 3)
                    f = false;
                else if (bel[i] == 3 && bel[y] == 2) 
                    f = false;
            }
            if (!f) {
                puts("No");
                continue;
            }
            puts("Yes");
            for (int i = 1; i <= cntb; i++) if (!vis[b[i]]) {
                printf("1 %d\n", b[i]);
                vis[b[i]] = true;
            }
            memset(vis, false, sizeof(vis));
            for (int i = 1; i <= cnta; i++) if (!vis[a[i]]) {
                printf("%d %d\n", b[1], a[i]);
                vis[a[i]] = true;
            }
        }
    }
    return 0;
}
2025/7/29 18:00
加载中...