最小势(慎用register)
#include#include #include #include #include #include using namespace std;const int maxn=10000+10;const int maxm=2000000+10;struct hh{ int v,next;}e[maxm];int n,m,point,ans;int del[maxn],head[maxn],pt[maxn],kd[maxn];template void read(T&x){ x=0;char c=getchar();int f=0; while(c<'0'||c>'9'){f|=(c=='-');c=getchar();} while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^=48),c=getchar(); x=f?-x:x;}void add(int u,int v){ e[++point].v=v;e[point].next=head[u];head[u]=point; e[++point].v=u;e[point].next=head[v];head[v]=point;}int main(){ memset(head,-1,sizeof(head)); read(n);read(m); int u,v; for(register int i=1;i<=m;i++) { read(u);read(v); add(u,v); } for(register int i=n;i;i--) { int k=0; for(int j=1;j<=n;j++)if(pt[j]>=pt[k]&&!del[j])k=j; del[k]=1; for(int j=head[k];j!=-1;j=e[j].next)if(!del[e[j].v])pt[e[j].v]++; } for(int i=n;i>0;i--)if(!kd[pt[i]]){ans++;kd[pt[i]]=1;} printf("%d",ans); return 0;}