好多写法都试过了就是 A 不了。
玉玉了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=110,maxm=3000;
const double eps=1e-8;
int deg[maxn],dep[maxn],sta[maxn];
int secu[maxm],secv[maxm],n,m,s,t,idx;
int pos[maxm],nxt[maxm],head[maxn],cur[maxn];
double cap[maxm];
inline void add(int u,int v,double w){
pos[++idx]=v,cap[idx]=w;
nxt[idx]=head[u],head[u]=idx;
}
inline bool bfs(){
for(int i=1;i<=t;i++) dep[i]=0;
queue<int>que;
que.push(s);
dep[s]=1;
int u,v;
while(que.size()){
u=que.front(); que.pop();
for(int i=head[u];i;i=nxt[i]){
v=pos[i];
if(cap[i]>eps and !dep[v]){
dep[v]=dep[u]+1;
que.push(v);
}
}
}
return dep[t]!=0;
}
double dfs(int u,double f){
if(u==t or !f) return f;
double res=0,tmp;
int v;
for(int &i=cur[u];i;i=nxt[i]){
v=pos[i];
if(cap[i]>eps and dep[v]==dep[u]+1 and (tmp=dfs(v,min(f,cap[i])))>eps){
res+=tmp,f-=tmp;
cap[i]-=tmp,cap[i^1]+=tmp;
if(f==0) return res;
}
}
return res;
}
inline bool check(double mid){
idx=1,s=n+1,t=n+2;
for(int i=1;i<=t;i++) head[i]=0;
int u=2*m;
for(int i=1;i<=n;i++){
add(i,t,u+2*mid-deg[i]);
add(t,i,0);
add(s,i,u);
add(i,s,0);
}
for(int i=1;i<=m;i++){
add(secu[i],secv[i],1);
add(secv[i],secu[i],1);
}
double res=0;
while(bfs()){
memcpy(cur,head,sizeof(int)*(t+1));
res+=dfs(s,1e9);
}
return res-u*n<-eps;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
while(cin>>n>>m){
if(m==0){
cout<<"1\n1\n";
continue;
}
for(int i=1;i<=n;i++) deg[i]=0;
for(int i=1;i<=m;i++){
cin>>secu[i]>>secv[i];
deg[secu[i]]++,deg[secv[i]]++;
}
double l=1.0/n,r=m,mid=0;
while(r-l>eps){
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
bfs();
int top=0;
for(int i=1;i<=n;i++){
if(dep[i]) sta[++top]=i;
}
if(!top){
cout<<"1\n1\n";
continue;
}
cout<<top<<"\n";
for(int i=1;i<=top;i++) cout<<sta[i]<<"\n";
}
return 0;
}