Codeforces Round #318(Div. 2)B. Bear and Three Musketeers(图,思维)

版权声明:《学习技巧》每次使用单边大脑的时间不要太久,连续使用左边大脑30分钟就如同连续使用左臂30分钟一样,周期性的交换让大脑两侧能够轮流休息,左脑活动包括了循序渐进的工作,解决逻辑问题与分析,而右脑活动包括了隐喻,创造性思考,模式匹配和可视化。 https://blog.csdn.net/intmainhhh/article/details/82929268

题目传送门
题目大意
有n个人,现在要从这n个人当中选出来3个人去当间谍.
选人的原则是,这3个人之间必须两两相互认识,并且,设cnti表示选出来的3个人中第i个人认识的人的数量(不包括另外两个人),要求cnt1+cnt2+cnt3的值是所有的可能中最小的那个.
现在,给你n以及m个认识的关系(xi,yi),表示xi和yi相互认识.
请你选出合适的三个人,然后只需输出对应的最小的cnt1+cnt2+cnt3的值即可.
Input
第一行两个整数n和m(3<=n<=4000,0<=m<=4000).
接下来m行,第i行包含两个正整数ai和bi(1<=ai,bi<=n,ai!=bi).
数据保证每对关系最多出现一次.
认识关系没有传递性,A认识B,B认识C,并不意味着A认识C.
Output
输出只有一个整数,表示满足要求的三个人的cnt1+cnt2+cnt3的值.
如果无法选出任何满足要求的三个人,则输出"-1".
Examples
样例输入1
5 6
1 2
1 3
2 3
2 4
3 4
4 5
样例输出1
2
样例输入2
7 4
2 1
3 6
5 1
1 7
样例输出2
-1
题目分析
其实就是在途中找到三角形,并且三个角所在结点的出度和最小,用vector<pair<int,int> >v;来存储每条边,然后枚举其他个点的出度来寻找满足条件的情况,代码如下:

#include<iostream>
#include<vector>
using namespace std;
const int maxn=4000+10;
vector<pair<int,int> >v;
bool G[maxn][maxn];
vector<int>g[maxn];
int main() {
    int n,m;
    cin>>n>>m;
    for(int i=0; i<m; i++) {
        int x,y;
        cin>>x>>y;
        v.push_back({x,y});
        G[x][y]=G[y][x]=1;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int ans=4000;
    for(int i=0; i<m; i++) {
        int x=v[i].first,y=v[i].second;
        for(int j=0; j<(int)g[y].size(); j++) {
            int z=g[y][j];
            if(G[x][z]) {
                int temp=(g[x].size()+g[y].size()+g[z].size());
                ans=min(ans,temp);
            }
        }
    }
    cout<<((ans==4000)?-1:(ans-6));

    return 0;
}

猜你喜欢

转载自blog.csdn.net/intmainhhh/article/details/82929268