就是有一些人和一些关系,从中选出一些人,他们与联盟中其他人都有关系,即构成完全图,剩下的其他人不能有一个关系
首先,度为0和1的应该先去掉,同时标记(与去掉的点)相关联的点为不可去掉,度同时-1,否则去掉的集合里就会出现关系;
继续搜索度更高的点,把可去的去掉,标记与其关联的点为不可去
重复上述操作,直到没有点可以去掉,此时判断是否为完全图,即不可去点的个数==min(deg[u]+1),u为所有剩下的不可去点
参考链接:http://www.cnblogs.com/staginner/archive/2012/08/21/2648919.html
代码:
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int maxn=50010;
int deg[maxn];//存入度数
vector<int> G[maxn];//节点
int p[maxn];
bool inis[maxn];//标记哦
void init()
{
int i,j;
memset(deg,0,sizeof(deg));
for(i=0; i<=n; i++)
{
G[i].clear();
}
int u,v;
while(m--)
{
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
deg[u]++;
deg[v]++;
}
}
bool cmp(int u,int v)
{
return deg[u]<deg[v];
}
void solve()
{
memset(inis,0,sizeof(inis));
int i,j;
for(i=1; i<=n; i++)
p[i]=i;
sort(p+1,p+n+1,cmp);
for(i=1; i<=n; i++)
{
int u=p[i];
if(inis[u]==false)
{
for(j=0; j<(int)(G[u].size()); j++)
{
int v=G[u][j];
deg[v]--;
inis[v]=true;
}
}
}
int cnt=0;
int minn=n;
for(i=1; i<=n; i++)
{
int u=p[i];
if(inis[u]==true)
{
cnt++;
minn=min(minn,deg[u]+1);
}
}
if(cnt==minn)
cout<<"Y"<<endl;
else
cout<<"N"<<endl;
}
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
if(m==0)
{
cout<<"Y"<<endl;
continue;
}
init();
solve();
}
return 0;
}