您的位置:首页 > 编程语言 > Go语言

hoj2434 going to know him

2012-01-30 17:19 489 查看
/*This Code is Submitted by billforum for Problem 2434 at 2012-01-30 17:11:48*/
#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;

struct point
{
int length;//朋友的个数
int step;
bool visit;
int f[1001];//存放朋友的号码
int num;
};

point data[1001];
bool know[1001][1001];//标识两人认识不
int main(int args,char **argv)
{
int g,n,gn,ntmp,ans=-1;
int atmp[1001];

while(cin>>g>>n)
{
if(g==0&&n==0) break;
//初始化
for(int i=0;i<n;i++)
{
data[i].length=0;
data[i].step=0;
data[i].visit=0;
data[i].num=i;
for(int j=0;j<1001;j++)
data[i].f[j]=-1;
}
ans=-1;
for(int i=0;i<1001;i++)
for(int j=0;j<1001;j++)
know[i][j]=0;
//对输入数据进行处理,构造关系
for(int i=0;i<g;i++)
{
cin>>gn;
for(int j=0;j<gn;j++)
cin>>atmp[j];
for(int k=0;k<gn;k++)
{
int t=atmp[k];
for(int j=k+1;j<gn;j++)
{
int s=atmp[j];
if(!know[t][s])
{
data[t].length++;
data[s].length++;
data[t].f[data[t].length-1]=s;
data[s].f[data[s].length-1]=t;
know[t][s]=1;
know[s][t]=1;
}
}
}
}
queue<point> list;
data[0].visit=1;
list.push(data[0]);
while(!list.empty())
{
point tmp=list.front();
if(tmp.num==n-1)
{
ans=tmp.step;
break;
}
//广搜
for(int k=0;k<tmp.length;k++)
{
int i=tmp.f[k];
if(data[i].visit) continue;
else
{
data[i].visit=1;
data[i].step=tmp.step+1;
list.push(data[i]);
}
}
list.pop();
}
if(ans==-1) cout<<"I can never know wywcgs!"<<endl;
else if(ans==1||ans==0) cout<<"I do know wywcgs!"<<endl;
else
{
cout<<"I can know wywcgs by at most "<<ans-1<<" person(s)!"<<endl;
}

}

return 0;
}

http://acm.hit.edu.cn/hoj/problem/view?id=2434
广搜思想,将每人认识的朋友存在一个变量中,然后在每个搜一遍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: