google code jam bad horse 图的广度遍历

这道题呢就是Google code jam上的题目bad horse

在网上一搜很多都是说叫做什么二分图,我当然没学过什么二分图,我只学过图的广度遍历,所以最后我做的也是广度遍历

图的存储结构用的邻接矩阵,就是有一个二维矩阵存储边,用一个一位数组存储结点信息

最后广度遍历:

如果与当前结点p相连的结点q的值与p的值是一样的那么就输出错误

很简单的题目,当然说的有点笼统,不想细说了

总结一下:

1,先用map将其转换为数值0,1,2,3....

2,然后建立二维矩阵bian[i][j]=0表示无边,bian[i][j]=1表示结点i和j 相连

3,广度遍历图并用一位数组保存结点属于的类别,0表示未访问,1表示属于1类别,2表示属于2类别

4,如果有两个相同的类别有边那么则出错。

这个题就是这么做当然二分图肯定比这个要复杂,应该再看一下二分图,今天就到这玩游戏了纪元2070

#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define MAX 205
int dian[MAX];
int bian[MAX][MAX];
int main()
{
	
	freopen("D:\\A-small-practice-1.in","r",stdin);
	freopen("D:\\A-small-practice-1.out","w",stdout);
	/********************************************/
	int T;
	cin>>T;
	int id=1;
	while(T--)
	{
		memset(bian,0,sizeof(bian));
		memset(dian,0,sizeof(dian));
		map<string,int> m;
		int bi=0;
		int M;
		cin>>M;
		for(int i=0;i<M;i++)//建立一个二维矩阵
		{
			string a,b;
			cin>>a>>b;
                           if(m.count(a)==0&&m.count(b)==0)
			{
				m[a]=bi;
				bi++;
				m[b]=bi;
				bi++;

			}else if(m.count(a)==0)
			{
				m[a]=bi;
				bi++;
			}else if(m.count(b)==0)
			{
				m[b]=bi;
				bi++;
			}
			bian[m[a]][m[b]]=1;     bian[m[b]][m[a]]=1;
		}
		queue<int> qi;
		dian[0]=1;
                  qi.push(0);
		int r=0;
		while(qi.size()>0&&r==0)
		{
			i=qi.front();
			qi.pop();
            for(int j=0;j<bi;j++)
			{
				if(bian[i][j]==1)
				{
					if(dian[j]==0)
					{
						dian[j]=(dian[i]==1)?2:1;
						qi.push(j);
					}
					else if(dian[i]==dian[j])
					{
					//	cout<<"Case #"<<id<<": No";
						r=1;
						break;
					}
				}
			}
		}
        if(r==0)
			cout<<"Case #"<<id<<": Yes"<<endl;
		else cout<<"Case #"<<id<<": No"<<endl;
		id++;
	}
	/********************************************/
	fclose(stdin);
	fclose(stdout);
	return 0;
}


 

你可能感兴趣的:(数据结构,程序设计)