#include #include #include #include using namespace std; int n; int m; vector Graph[100111]; bool TFO[100111]; int depth[100111]; int father[100111]; pair marked[100111]; bool vers[100111]; vector< pair > ans; bool DFS(int ver,int dad) { int i,j; father[ver] = dad; depth[ver] = depth[dad] + 1; TFO[ver] = true; for (i=0;i depth[ver]) continue; if ( (depth[ver] - depth[ Graph[ver][i] ] + 1) % 2 == 0 ) { printf("Yes\n"); printf("%d %d\n",depth[ver] - depth[ Graph[ver][i] ] + 1); ans.clear(); ans.push_back(make_pair(Graph[ver][i], ver)); vers[ver] = true; vers[ Graph[ver][i] ] = true; int cur = ver; while(cur != Graph[ver][i]) { ans.push_back(make_pair(cur,father[cur])); vers[cur] = true; vers[ father[cur] ] = true; cur = father[cur]; } bool isf = true; for (j=1;j<=n;j++) { if (!vers[j]) continue; if (isf) { printf("%d",j); isf = false; } else printf(" %d",j); } printf("\n"); for (j=0;j other; while(cur != Graph[ver][i]) { if (marked[cur] != make_pair(-1,-1)) { other = marked[cur]; marked[cur] = make_pair(-2,-2); foundit = true; } else { marked[cur] = make_pair(ver, Graph[ver][i]); } cur = father[cur]; } if (foundit) { ans.clear(); ans.push_back(make_pair(Graph[ver][i], ver)); vers[ver] = true; vers[ Graph[ver][i] ] = true; cur = ver; while(cur != Graph[ver][i]) { if (marked[cur] != make_pair(-2,-2)) { ans.push_back(make_pair(cur, father[cur])); vers[cur] = true; vers[ father[cur] ] = true; } cur = father[cur]; } ans.push_back(make_pair(other.first,other.second)); vers[other.first] = true; vers[other.second] = true; cur = other.first; while(cur != other.second) { if (marked[cur] != make_pair(-2, -2)) { ans.push_back(make_pair(cur, father[cur])); vers[cur] = true; vers[ father[cur] ] = true; } cur = father[cur]; } printf("Yes\n"); printf("%d %d\n",(int)ans.size(),(int)ans.size()); bool isf = true; for (j=1;j<=n;j++) { if (!vers[j]) continue; if (isf) { printf("%d",j); isf = false; } else printf(" %d",j); } printf("\n"); for (j=0;j