k-truss

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;
	//计算最大顶点编号为n
	while (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;
}
Windows 系统修复工具主要用于解决 Windows 11/10 系统中的各种常见问题,具有操作简单、功能全面等特点: 文件资源管理器修复:可解决文件资源管理器卡死、崩溃、无响应等问题,能终止崩溃循环。还可修复右键菜单无响应或选项缺失问题,以及重建缩略图缓存,让图片、视频等文件的缩略图正常显示,此外,还能处理桌面缺少回收站图标、回收站损坏等问题。 互联网和连接修复:能够刷新 DNS 缓存,加速网页加载速度,减少访问延迟。可重置 TCP/IP 协议栈,增强网络连接稳定性,减少网络掉线情况,还能还原 Hosts 文件,清除恶意程序对网络设置的篡改,保障网络安全,解决电脑重装系统后网络无法连接、浏览器主页被篡改等问题。 系统修复:集成系统文件检查器(SFC),可自动扫描并修复受损的系统文件。能解决 Windows 激活状态异常的问题,还可重建 DLL 注册库,恢复应用程序兼容性,解决部分软件无法正常运行的问题,同时也能处理如 Windows 沙箱无法启动、Windows 将 JPG 或 JPEG 保存为 JFIF 等系统问题。 系统工具维护:提供启动管理器、服务管理器和进程管理器等工具,用户可控制和管理启动程序、系统服务和当前运行的进程,提高系统的启动和运行速度,防止不必要的程序和服务占用系统资源。还能查看系统规格,如处理器线程数、最大显示分辨率等。 故障排除:集成超过 20 个微软官方诊断工具,可对系统问题进行专业排查,还能生成硬件健康状态报告。能解决搜索和索引故障、邮件和日历应用程序崩溃、设置应用程序无法启动等问题,也可处理打印机、网络适配器、Windows 更新等相关故障。 其他修复功能:可以重置组策略设置、catroot2 文件夹、记事本等多种系统设置和组件,如重置 Windows 应用商店缓存、Windows 防火墙设置等。还能添加重建图标缓存支持,恢复粘滞便笺删除
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值