我是萨比
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int ans[110];
int hehe;
int U[1010],V[1010],d[1010];
bool vis[110];
struct edge {
int v,next;
double f;
}e[3010];
int cnt,head[110];
int gap[110],h[110];
int read_int () {
char c = getchar();
int re = 0;
for(;c > '9' || c < '0';c = getchar());
for(;c >= '0' && c <= '9';c = getchar())
re = re * 10 + c - '0';
return re;
}
void adde (int u,int v,double f) {
e[++cnt].v = v;
e[cnt].f = f;
e[cnt].next = head[u];
head[u] = cnt;
}
double dfs (int u,double minf) {
if(u == n + 1)
return minf;
int chan = n + 1;
double leftf = minf;
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(e[i].f) {
if(h[v] == h[u] - 1) {
double t = dfs(v,min(leftf,e[i].f));
e[i].f -= t;
e[i ^ 1].f += t;
leftf -= t;
if(h[0] >= n + 2)
return minf - leftf;
if(!leftf)
break;
}
chan = min(chan,h[v]);
}
}
if(leftf == minf) {
if(--gap[h[u]] == 0)
h[0] = n + 2;
++gap[h[u] = chan + 1];
}
return minf - leftf;
}
bool work (double k) {
cnt = -1;
memset(head,-1,sizeof head);
for(int i = 1;i <= n;++i) {
adde(0,i,m);
adde(i,0,0);
adde(i,n + 1,k * 2 - d[i] + m);
adde(n + 1,i,0);
}
for(int i = 1;i <= m;++i) {
adde(U[i],V[i],1);
adde(V[i],U[i],1);
}
memset(gap,0,sizeof gap);
memset(h,0,sizeof h);
gap[0] = n + 2;
double re = 0;
while(h[0] < n + 2)
re += dfs(0,0x3f3f3f3f);
re -= n * m;
re *= -1;
if(re == 0)
return 1;
return 0;
}
void dfs1 (int u) {
vis[u] = 1;
if(u >= 1 && u <= n)
ans[++hehe] = u;
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(e[i].f && !vis[v])
dfs1(v);
}
}
int main () {
n = read_int();
m = read_int();
if(m == 0) {
printf("1\n1\n");
return 0;
}
for(int i = 1;i <= m;++i) {
U[i] = read_int();
V[i] = read_int();
++d[U[i]];
++d[V[i]];
}
double l = 0,r = m,mid;
while(r - l >= 1.0 / (n * n)) {
mid = (l + r) / 2;
if(work(mid))
r = mid;
else l = mid;
}
work(l);
dfs1(0);
sort(ans + 1,ans + 1 + hehe);
printf("%d\n",hehe);
for(int i = 1;i <= hehe;++i)
printf("%d\n",ans[i]);
}