k-truss

news/2024/12/29 14:45:17/

k-truss是一种子图结构,用于在图中寻找凝聚子图。类似的结构还有k-core

支持度(support):图的一条边e包含在k个三角形中,则support(e) = k

k-truss:图G的极大子图g。在g中,每条边的support >= k-2。
(也可以简化定义为support >= k)

很明显,对于两个正整数 k 1 > k 2 k_1\gt k_2 k1>k2 k 1 k_1 k1-truss ⊆ k 2 \subseteq k_2 k2–truss

truss decomposition:为了计算一个图中所有的k-truss,可以计算每条边的turssness。边e所在的最大k值的k-truss,trussness(e) = k。k-truss是所有trussness(e) >= k的边的诱导子图。

代码:

#include <stdio.h>
#include <vector>
#include <map>
#include <queue>
using namespace std;vector<int> *g;
map<pair<int, int>, int> edge;
int n, m;  //最大顶点为n,边的数量为m
vector<int> sup, truss;   //边的支持度和truss
vector<pair<int, int>> edge2;void BuildGraph(char* file);
void truss_decomposition();
int sup_calculation();
vector<int> k_truss(int K);void BuildGraph(char* file)   //建立图
{FILE* f = fopen(file, "r");int a, b;//计算最大顶点编号为nwhile (fscanf(f, "%d %d", &a, &b) != EOF){if (a > n) n = a;if (b > n) n = b;++m;}rewind(f);g = new vector<int>[n + 1];edge2.resize(m);m = 0;//int eid = 0;while (fscanf(f, "%d %d", &a, &b) != EOF){if (a == b) continue;  //忽略指向自己的边if (a < b)  //令a>b{int t = a;a = b;b = t;}if (edge.find(pair<int, int>(a, b)) == edge.end())  //这条边目前不存在,避免重边{g[a].push_back(b);g[b].push_back(a);edge2[m] = pair<int, int>(a, b);edge[pair<int, int>(a, b)] = m;edge[pair<int, int>(b, a)] = m++;}}truss.resize(m);sup.resize(m);fclose(f);
}void truss_decomposition()
{int maxsup = sup_calculation();vector<int> *bin = new vector<int>[maxsup + 1];for (int i = 0; i < m; ++i)bin[sup[i]].push_back(i);vector<bool> del(m, false);for (int i = 0; i <= maxsup; ++i){for (int j = 0; j < bin[i].size(); ++j){int eid = bin[i][j];if (del[eid] == true) continue;truss[eid] = i + 2;del[eid] = true;int x = edge2[eid].first;int y = edge2[eid].second;if (g[x].size() < g[y].size()){int t = x;x = y; y = t;}for (int k = 0; k < g[y].size(); ++k){int w = g[y][k];int e = edge[pair<int, int>(y, w)];if (del[e] == true) continue;if (edge.find(pair<int, int>(x, w)) != edge.end())  //xyw构成三角形{e = edge[pair<int, int>(x, w)];if (del[e] == true) continue;if (sup[e] > i){sup[e]--;bin[sup[e]].push_back(e);}e = edge[pair<int, int>(y, w)];if (sup[e] > i){sup[e]--;bin[sup[e]].push_back(e);}}}}}delete[] bin;
}vector<int> k_truss(int K)   //计算指定k的k-truss
{queue<int> q;vector<int> res;vector<bool> del(m, false);int maxsup = sup_calculation();for (int i = 0; i < m; ++i){if (sup[i] < K - 2)q.push(i);}while (q.empty() == false){int eid = q.front();q.pop();if (del[eid] == true) continue;del[eid] = true;int x = edge2[eid].first;int y = edge2[eid].second;if (g[x].size() < g[y].size()){int t = x;x = y;y = t;}for (int k = 0; k < g[y].size(); ++k){int w = g[y][k];int e = edge[pair<int, int>(y, w)];if (del[e] == true) continue;if (edge.find(pair<int, int>(x, w)) != edge.end())  //xyw构成三角形{e = edge[pair<int, int>(x, w)];if (del[e] == true) continue;sup[e]--;if (sup[e] < K - 2)q.push(e);e = edge[pair<int, int>(y, w)];sup[e]--;if (sup[e] < K - 2)q.push(e);}}}for (int i = 0; i < m; ++i)if (del[i] == false)res.push_back(i);return res;
}int sup_calculation()
{int maxsup = 0;for (int i = 0; i <= n; ++i){for (int j = 0; j < g[i].size(); ++j){int w = g[i][j];    //i的相邻顶点if (i > w){int eid = edge[pair<int, int>(i, w)];  //边(i,w)sup[eid] = 0;//degree(u)>degree(v)int u = g[i].size() > g[w].size() ? i : w;int v = g[i].size() > g[w].size() ? w : i;for (int k = 0; k < g[v].size(); ++k)   //w的相邻顶点{if (edge.find(pair<int, int>(u, g[v][k])) != edge.end())sup[eid]++;}if (sup[eid] > maxsup)maxsup = sup[eid];}}}return maxsup;
}

http://www.ppmy.cn/news/189631.html

相关文章

Caterpillar CAT SIS卡特彼勒最新零件目录系统+维修信息

Caterpillar CAT SIS卡特彼勒最新零件目录系统维修信息 Caterpillar SIS 2011B数据到 2013卡特彼勒最新零件目录系统 含所有卡特工程机械的零件目录&#xff0c;维修信息,带 2012配件价格重量查询 无需注册&#xff0c;一键安装&#xff0c;一鍵维护&#xff0c;永不过期…

山特UPS电源三种工作模式解析

最近一周陆续接到几个终端客户的售后电话。或是因为机房发生了停电事故,或是突然发现UPS电源红灯故障。因为大部分客户对UPS的工作模式很不了解,导致一次故障后UPS一直处于旁路工作模式,所以本人写来此文来加强大家对UPS工作状态的认识。 1.山特UPS工作原理: UPS即不间断电…

全志F1C200S F1C100S 介绍

很久以前发现了一颗性价比极高而且比较好玩的SOC&#xff0c;加群请仔细阅读本博客&#xff08;见DKTool界面&#xff0c;请备注“来自博客”&#xff09; 那就是全志F1C100S F1C200S&#xff0c;其中F1C100S内置32MB DDR1内存&#xff0c;F1C200S内置64MB DDR1内存。 这个片…

【mcuclub】温度传感器DS18B20

1、实物图 2、原理图 VCC&#xff1a;外接供电电源输入端。 DQ&#xff1a; 数字信号输入&#xff0f;输出端。 GND&#xff1a;电源地线 为什么接上拉电阻&#xff1a; 因为DS18B20的数据口是漏极开路&#xff0c;如果不接上拉电阻&#xff0c;则只能输出低电平和高阻态&a…

STC8F2K08S2

STC8F2K08S2 是STC新STC8系列的一款增强型51单片机&#xff0c;尺寸小&#xff0c;性能强&#xff0c;外围电路非常简单。内部时钟频率可达27MHz&#xff0c;在相同时钟频率下&#xff0c;指令执行速度相对于STC15系列 、STC12系列又进一步提升。此款单片机的亮点是封装尺寸小&…

家用计算机台式输入电压,家用电脑电器选用什么样的ups好?

度了下山特的ups资料&#xff0c;家用电脑电器用选什么样的为妥&#xff1f;分类很是繁杂啊&#xff1a; 山特UPS电源- 后备式UPS 山特MT系列 MT系列ups电源是专门针对网络节点及高档工作站用户而设计的全能上网型UPS。MT500/MT1000(S)分别具备800VA/1600VA的稳压输出容量&…

导轨中间继电器JDZY-1202/DC110V

系列型号&#xff1a; JDZY-1000系列中间继电器 JDZY-1033中间继电器&#xff1b;JDZY-1403中间继电器&#xff1b; JDZY-1440中间继电器&#xff1b;JDZY-1004中间继电器&#xff1b; JDZY-1800中间继电器&#xff1b;JDZY-1330中间继电器&#xff1b; JDZY-1204中间继电…

山特UPS电量信息采集环境配置

山特UPS电量信息采集环境配置 硬件需求 支持智能卡插口的山特UPS山特NMC网络管理卡 安装与配置NMC卡 NMC 是一种介于UPS和网络的设备&#xff0c;它可以从UPS获得状态信息并且发出指令。NMC支持两种协议&#xff0d;简易网络管理协议(SNMP)和超文件传输协议(HTTP)以供使用者…