NKOJ2319 奇怪的班级 题解

Posted Al_X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NKOJ2319 奇怪的班级 题解相关的知识,希望对你有一定的参考价值。

  这是一道判断图中有没有奇环的问题,用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 }
View Code

 

以上是关于NKOJ2319 奇怪的班级 题解的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2716 & NKOJ2739:[Violet 3]天使玩偶——题解

CQOI2015多项式题解 (NKOJ3252)

Android片段底部的奇怪空白?

奇怪的 SSIS 错误(进程退出代码 255)

JUnit 是不是对您的班级名称有一些奇怪的 30 个字符长度限制?

更改片段(子片段)时 RecyclerView 中的奇怪叠加