这是一道判断图中有没有奇环的问题,用dfs,二分图染色法即可。
图的存储用邻接表表示,用邻接矩阵会MLE。
需要注意的一点是图中点与点之间并不一定都是连通的,染色的时候不要漏点。
1 #include<iostream> 2 #include<map> 3 #include<vector> 4 #include<string> 5 using namespace std; 6 7 bool setSex(map<int, int>& sex, vector<vector<int> >& isLoved, int code, int sexCode) 8 { 9 sex[code] = sexCode; 10 for (int i = 0; i < isLoved[code].size(); ++i) 11 { 12 if (sex[isLoved[code][i]] == sexCode)return true; 13 if (sex[isLoved[code][i]] ==0&& setSex(sex, isLoved, isLoved[code][i], -sexCode))return true; 14 } 15 return false; 16 } 17 18 int main() 19 { 20 int t; 21 cin >> t; 22 for (int i = 0; i < t; ++i) 23 { 24 map<string, int> nameToCode; 25 map<int, int> sex;//编号为i的人的性别。0代表未设定,1、-1分别代表男女 26 int N, M; 27 scanf("%d%d", &N, &M); 28 vector<pair<int, int> > temp; 29 int code=1; 30 for (int j = 0; j < M; ++j) 31 { 32 string name1,name2; 33 name1.resize(22); 34 name2.resize(22); 35 scanf(" %s", &name1[0]); 36 scanf(" %s", &name2[0]); 37 //cout << name1 << name2 << endl; 38 if (!nameToCode[name1]) 39 { 40 nameToCode[name1] = code++; 41 } 42 if (!nameToCode[name2]) 43 { 44 nameToCode[name2] = code++; 45 } 46 temp.push_back({ nameToCode[name1] ,nameToCode[name2] }); 47 } 48 vector<vector<int> > isLoved; 49 for (int i = 0; i <= nameToCode.size(); ++i) 50 { 51 isLoved.push_back(vector<int>(0)); 52 } 53 for (int i = 0; i < temp.size(); ++i) 54 { 55 isLoved[temp[i].first].push_back(temp[i].second); 56 isLoved[temp[i].second].push_back(temp[i].first); 57 } 58 bool hasHomo = 0; 59 for (int i = 1; i < nameToCode.size(); ++i) 60 { 61 if (sex[i]==0) 62 { 63 if (setSex(sex, isLoved, i, 1) == true) 64 { 65 hasHomo = true; 66 break; 67 } 68 } 69 } 70 if (hasHomo) printf("YES\n"); 71 else printf("NO\n"); 72 } 73 }
时间: 2024-11-12 01:36:46