codeforces 771 (VK Cup 2017 - Round 1)

回眸只為那壹抹淺笑 提交于 2019-11-30 05:15:21

A. Bear and Friendship Condition

•题意

给你n个人,m个朋友关系

朋友是会传递的,若A B是朋友,A C是朋友,则必须有B C的朋友关系

符合这个关系输出YES,否则输出NO

•思路

n个人,但凡是有朋友关系的,必定在同一个朋友圈内

所以可以分成若干个朋友圈

在一个朋友圈内部,若符合条件肯定是互为朋友

也就是 是一个完全图

接下来就是判断是否是完全图了

举个栗子:1234在一个朋友圈内,且符合条件

则人与朋友的对应关系为

1与1 2 3 4为朋友

2与1 2 3 4为朋友

3与1 2 3 4为朋友

4与1 2 3 4为朋友

即,他们的朋友是完全相同的!

挨个去判断朋友是否相同显然时间复杂度不够优雅

只需要排序后,看第一个朋友是否相等就可以

O(n)变O(1)!

为什么呢? 因为每个人的朋友圈都要去查看一遍,如果A的朋友圈没有B,但是B的朋友圈有A

那么,B和A的朋友圈肯定对不上,所以就输出NO了

•代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=2e5+5;
 5 vector<int> a[maxn];
 6 //我加vis数组是为了减少不必要的查看来减少时间
 7 //氮素 貌似效率还不如不加vis的,搞不懂 ???
 8 bool vis[maxn];
 9 
10 int main()
11 {
12 //    freopen("C:\\Users\\14685\\Desktop\\C++workspace\\in&out\\contest","r",stdin);
13     int n,m;
14     cin>>n>>m;
15     for(int i=1;i<=m;i++)
16     {
17         int x,y;
18         cin>>x>>y;
19         a[x].push_back(y);
20         a[y].push_back(x);
21     }
22     ///把自己也加进自己的朋友圈
23     for(int i=1;i<=n;i++)
24         a[i].push_back(i);
25     ///排序
26     for(int i=1;i<=n;i++)
27         sort(a[i].begin(),a[i].end());
28 
29     ///查看每个人的朋友圈
30     for(int i=1;i<=n;i++)
31     {
32         if(vis[i])
33             continue;
34         ///自己的朋友圈和朋友的朋友圈对比
35         for(int j=0;j<a[i].size();j++)
36         {
37             if(a[i].size()==a[a[i][j]].size())
38             {
39                 vis[a[i][j]]=true;
40                 ///朋友圈不相同
41                 if(a[i][0]!=a[a[i][j]][0])
42                 {
43                     puts("NO");
44                     return 0;
45                 }
46             }
47             else
48             {
49                  puts("NO");
50                  return 0;
51             }
52         }
53     }
54     puts("YES");
55 }
View Code

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!