觉得浮夸了四年,漠然发现原来是浮躁了四年!

hdu 4460(STL+BFS)

Problem link adress  :hdu  4460

Problem analysis:

For this problem,first give you some people's name and then give you the relations of them.

Now,you task is calculate the maximum steps between the every two guys.

To solve the problem,you just need to calculate all the steps between the every two guys.

And of course,the BFS is good to use.

Here is the detailed code:

#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int M=1020;
const int INF=0x3f3f3f3f3f;
int dis[M][M];//记录每两个人之间的距离
int mark[M];
int n,m;
map<string,int>match;
vector<int>vec[M];
queue<int>q;
void BFS(int x)//实现标号为x的人的朋友关系搜索
{
	memset(mark,0,sizeof(mark));
	dis[x][x]=0;
	mark[x]=1;
	q.push(x);
	while(!q.empty())
	{
		int t=q.front();
		q.pop();
		int y=vec[t].size();//统计标号为t的人的直接朋友人数
		for(int j=0;j<y;j++)//对他的每一个朋友进行操作
		{
			int v=vec[t][j];//v记录t的直接朋友
			if(mark[v])
				continue;
			dis[x][v]=dis[x][t]+1;//x到v的朋友距离为x到t的朋友距离加1
			q.push(v);
			mark[v]=1;
		}
	}
}
	
int main()
{
	string name,name1,name2;
	while(cin>>n)
	{
		if(n==0)
			break;
	    int i,j;
		for(i=0;i<n;i++)
		{
			cin>>name;
			match[name]=i;
		}
		for(i=0;i<n;i++)
		{
			dis[i][i]=0;
			for(j=i+1;j<n;j++)
				dis[i][j]=dis[j][i]=INF;
		}
		cin>>m;
		for(i=0;i<n;i++)//对容器的初始化
			vec[i].clear();
		while(m--)//建立每个人的直接朋友关系
		{
			cin>>name1>>name2;
			int t1=match[name1];
			int t2=match[name2];
			vec[t1].push_back(t2);
			vec[t2].push_back(t1);
		}
		for(i=0;i<n;i++)//对每个人进行搜索
		 BFS(i);
		int ans=0;
		for(i=0;i<n;i++)//选择最大的朋友距离
		{
			for(j=i+1;j<n;j++)
			{
				if(dis[i][j]>ans)
					ans=dis[i][j];
			}
		}
		if(ans==INF)
			ans=-1;
		cout<<ans<<endl;
		
	}
	return 0;
}

  

  

 

 

 

 

posted @ 2012-12-19 18:58  heat nan  阅读(258)  评论(0编辑  收藏  举报