题目链接:FZU - 2141
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
struct node{
int v, nex;
}edge[30000];
int head[105];
int cnt, N, M;
void add(int u, int v){
edge[cnt].v=v;
edge[cnt].nex=head[u];
head[u]=cnt++;
}
int color[105];
vector<int> U, V;
void get_color(int x){
int cnt1,cnt2;
cnt1=cnt2=0;
for(int i=head[x]; i!=-1; i=edge[i].nex){
if(color[edge[i].v]==1) cnt1++;
else cnt2++;
}
if(cnt1>cnt2){
color[x]=2;
V.push_back(x);
}
else{
color[x]=1;
U.push_back(x);
}
}
int main(){
int T, u, v;
scanf("%d", &T);
while(T--){
cnt=0;
U.clear();
V.clear();
memset(color, 0, sizeof(color));
memset(head, -1, sizeof(head));
scanf("%d%d", &N, &M);
for(int i=0; i<M; i++){
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
for(int i=1; i<=N; i++){
get_color(i);
}
printf("%d", U.size());
for(int i=0; i<U.size(); i++)
printf(" %d", U[i]);
printf("\n");
printf("%d", V.size());
for(int i=0; i<V.size(); i++)
printf(" %d", V[i]);
printf("\n");
}
return 0;
}