bzoj1006

最小势(慎用register)

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
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 <class T> 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;
} 
View Code

 

posted @ 2017-10-23 17:47  新手-周  阅读(179)  评论(0编辑  收藏  举报