这道题呢就是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;
}