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