太玄了,累了,毁灭吧
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read(){
int ret=0;
char ch=' ',c=getchar();
while(!('0'<=c&c<='9')) ch=c,c=getchar();
while('0'<=c&&c<='9') ret=(ret<<1)+(ret<<3)+(c^48),c=getchar();
return ch=='-'?-ret:ret;
}
int n,m;
int S,T;
const int N=1e3+10,M=1e5+10;
int to[M],nt[M],c[M],idx,h[N],cur[N];
inline void add(int x,int y,int z){
to[idx]=y,nt[idx]=h[x],c[idx]=z,h[x]=idx++;
to[idx]=x,nt[idx]=h[y],c[idx]=0,h[y]=idx++;
}
int lv[N];
int q[N],tt=-1,hh=0;
bool bfs(){
memset(lv,-1,sizeof(lv));
hh=0,tt=-1;
q[++tt]=S;
lv[S]=0;
cur[S]=h[S];
while(hh<=tt){
int u=q[hh++];
for(int i=h[u];i!=-1;i=nt[i]){
int j=to[i];
if(lv[j]!=-1||c[i]==0) continue;
q[++tt]=j;
lv[j]=lv[u]+1;
cur[j]=h[j];
if(j==T) return true;
}
}
return false;
}
int find(int u,int limit){
if(u==T) return limit;
int flow=0;
for(int i=cur[u];i!=-1;i=nt[i]){
int j=to[i];
cur[u]=i;
if(lv[j]!=lv[u]+1||c[i]==0) continue;
int k=find(j,min(c[i],limit-flow));
if(k==0) lv[j]=-1;
flow+=k;
c[i]-=k;
c[i^1]+=k;
}
return flow;
}
int dinic(){
int ans=0,flow=0;
while(bfs()){
while(flow=find(S,0x7f7f7f7f)) ans+=flow;
}
return ans;
}
void show_ans(int id){
for(int t=h[id];t!=-1;t=nt[t]){
int j=to[t];
if(m+1<=j&&j<=m+n&&c[t]==0){
printf("\n%d",j-m-1);
return ;
}
}
}
int main(){
memset(h,-1,sizeof(h));
n=read(),m=read();
S=0,T=n+m+1;
for(int i=1;i<=n;i++) add(i+m,T,1);
int flow=0,pre;
for(int i=1;i<=m;i++){
add(S,i,1);
add(i,read()+1+m,1);
add(i,read()+1+m,1);
flow+=dinic();
if(flow<i){
printf("%d",i-1);
for(int u=1;u<i;u++) show_ans(u);
return 0;
}
}
printf("%d",m);
for(int u=1;u<=m;u++) show_ans(u);
return 0;
}