吐血三升,早知道我就一心的去搞这个题目了,补了十几分钟就AC 完全没有问题
gg思密达 ,就是写的长了点但是思路还是比较简单的,就是判断条件多
就是用了一个并查集,然后把相同集合的放在一起
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<set>
using namespace std;
const int maxn=50;
set<int> ans[50];
set<int> ::iterator it;
int pr[maxn];
int ao[maxn];
void init(int n)
{
for(int i=0;i<=n;i++)
pr[i]=i;
}
int find(int x)
{
if(x==pr[x])
return x;
else
return pr[x]=find(pr[x]);
}
void uion(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx==yy)
return;
else
pr[xx]=yy;
}
int main()
{
int n,m;
cin>>n>>m;
init(n);
memset(ao,0,sizeof(ao));
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
uion(x,y);
}
set<int> s;
int z=find(1);
s.insert(z);
for(int i=2;i<=n;i++)
{
if(find(i)!=z)
{
z=find(i);
s.insert(z);
}
}
int num=0;
for(it=s.begin();it!=s.end();it++)
{
for(int i=1;i<=n;i++)
{
if(find(i)==*it)
{ //cout<<*it<<endl;
ans[num].insert(i);
}
}
num++;
}
int flag=0;
int t=0;
int nn=0;
for(int i=0;i<num;i++)
{
if(ans[i].size()>3)
{
flag=1;
break;
}
else if(ans[i].size()==1)
{
it=ans[i].begin();
ao[t]=*it;
ans[i].clear();
t++;
}
else if(ans[i].size()==2)
nn++;
}
if(nn>t)
flag=1;
if(flag)
cout<<"-1"<<endl;
else
{
int tt=0;
for(int i=0;i<num;i++)
{
if(ans[i].size())
{
it=ans[i].begin();
if(ans[i].size()==3)
{
for(;it!=ans[i].end();it++)
{
if(it==ans[i].begin())
cout<<*it;
else
cout<<" "<<*it;
}
cout<<endl;
}
if(ans[i].size()==2)
{
for(;it!=ans[i].end();it++)
{
cout<<*it<<" ";
}
cout<<ao[tt]<<endl;;
tt++;
}
}
}
if(t!=0&&tt<t)
cout<<ao[tt];
for(int i=tt+1;i<t;i++)
cout<<" "<<ao[i];
cout<<endl;
}
return 0;
}
看来题目的取舍是一门很深的学问,有的时候要相信自己,不要跟着别人跑人云亦云,做出来多的题目可能是简单,但是有的时候不如这种虽然写起来麻烦,但是自己已经有数的题目,看你的选择喽,选对了就赢,错,就gg,
其实当时发现A 一直错的时候就应该回头改C ,因为C已经写完了,
血亏一把,还是能力不够