Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- #include<list>
- using namespace std;
- struct rt {
- int to,nr;
- };
- int n,m;
- list<int> G[50010];
- vector<int> rts[50010];
- int odd;
- int cnta,cntb;
- void edfs(int f)
- {
- while(!G[f].empty())
- {
- int g=G[f].back();
- G[f].pop_back();
- for(list<int>::iterator it=G[g].begin();it!=G[g].end();it++)
- {
- if(f==(*it)) {G[g].erase(it); break; }//
- }
- edfs(g);
- }
- if(f==odd)
- {
- cnta++;
- }else rts[cnta].push_back(f);
- }
- int main()
- {
- int Z;
- scanf("%d",&Z);
- while(Z--)
- {
- scanf("%d %d",&n,&m);
- //clear
- for(int i=0;i<=n+5;i++)
- {
- G[i].clear();
- rts[i].clear();
- }
- odd=-1; cnta=0;cntb=0;
- for(int i=1;i<=m;i++)
- {
- int a,b;
- scanf("%d %d",&a,&b);
- G[a].push_back(b);
- G[b].push_back(a);
- }
- for(int i=1;i<=n;i++)
- {
- if(G[i].size()%2!=0)
- {
- odd=n+1;
- G[i].push_back(odd);
- G[odd].push_back(i);
- }
- }
- if(odd==-1)
- {
- edfs(1);
- }
- else
- edfs(odd);
- for(int i=0;i<=cnta;i++)
- if(rts[i].size()>1) cntb++;
- printf("%d\n",cntb);
- for(int i=0;i<=cnta;i++)
- {
- if(rts[i].size()>1) {
- int r=rts[i].size();
- printf("%d ",r);
- for(unsigned j=0;j<rts[i].size();j++)
- {
- printf("%d ",rts[i][j]);
- }
- printf("\n");
- }
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment