手机网站用什么软件做,网站开发用的软件,wordpress侧边栏字体修改,自己做的网站可以用于百度推广吗目录
题目#xff1a;
示例#xff1a;
分析#xff1a;
代码#xff1a; 题目#xff1a; 示例#xff1a; 分析#xff1a;
题目给我们一个无向图#xff0c;要我们找出三个节点#xff0c;这三个节点他们两两相连#xff0c;这三个节点除了连接到对方的其他线…目录
题目
示例
分析
代码 题目 示例 分析
题目给我们一个无向图要我们找出三个节点这三个节点他们两两相连这三个节点除了连接到对方的其他线被称为连通三元组的度数问我们图中最小的三元组度数是多少。
我的第一个想法就是使用map来构建图然后遍历每个节点再遍历每个节点的相邻节点再遍历每个节点的相邻节点的相邻节点如果节点的相邻节点的相邻节点是该节点那么我们就找到了连通三元组他们总体的度数-6就是连通三元组的度数。因为三元组中每个节点为了连通另外两个节点都需要花费两个度而剩余的度就是连接其他非本三元组的节点了所以连通三元组的度数就是三个节点的总度数-2*3。 不过这么做就超时了因为同一个三元组我们会重复遍历三次每个节点我们都会遍历寻找包括它的连通三元组。虽然这种方式超时了但也不失为一种方法代码在下面可以参考。
那么直接构建图不行我们可以构建图的邻接矩阵。
我们另外再拿一个数组来存放每个节点的度数。
邻接矩阵用来判断三个点是否是相互连通的度数数组用来计算连通三元组的度数。 代码
class Solution {
public:int minTrioDegree(int n, vectorvectorint edges) {//超时unordered_mapint,unordered_setintm;for(auto edge:edges){ //构建图if(m.find(edge[0])m.end()) m[edge[0]]unordered_setint();if(m.find(edge[1])m.end()) m[edge[1]]unordered_setint();m[edge[0]].insert(edge[1]);m[edge[1]].insert(edge[0]);}int resINT_MAX;for(auto i:m){ //取出每个节点for(auto j: i.second){ //取出相连的节点集for(auto k: m[j]){ //取出相连的节点的相连结果集if(m[k].count(i.first)){ //若是等于第一个节点,那么表示这仨节点相互连通resmin(res,static_castint(i.second.size()m[j].size()m[k].size()-6));}}}}return resINT_MAX?-1:res;//构建邻接矩阵 int resINT_MAX;vectorvectorintpic(n1,vectorint(n1,0)); //连通矩阵vectorintdu(n1,0); //每个点的度for(auto edge: edges){ //构建邻接矩阵以及获取每个节点的度pic[edge[0]][edge[1]]1;pic[edge[1]][edge[0]]1;du[edge[0]];du[edge[1]];} for(int i1;in;i){ for(int ji1;jn;j){for(int kj1;kn;k){//遍历每个节点,找到相互连通的三个节点,度数之和-6就是连通三元组的读度数if(pic[i][j] pic[j][k] pic[i][k]) resmin(res,du[i]du[j]du[k]-6);}}}return resINT_MAX?-1:res;}
};