bzoj1006
貌似是最大势 见cdq论文《弦图与区间图》
#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; }
#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; }