HDU 6350 Always Online——仙人掌图

news/2024/12/22 14:04:54/

思路:把每个环的最小边去掉,加在环的其他边上,然后并查集跑一下就可以,跑的时候维护一下某位为1的点有多少个

#include    <cstdio>
#include    <vector>
#include  <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
const int maxn = 1e5 + 10;
int n, m;
vector<int> G[maxn], v1, v2;
struct Edge {int u, v, cap;bool operator < (const Edge &t) const {return cap > t.cap;}
}edge[maxn<<1];
bool cmp(int i, int j) {return edge[i].cap > edge[j].cap;
}
int fa[maxn];
int que[maxn], pre[maxn], dep[maxn];
int cnt1[maxn][32], sz[maxn];void init() {v1.clear();v2.clear();for (int i = 0; i <= n; i++) G[i].clear();for (int i = 0; i <= n; i++) fa[i] = i;
}
int query(int x) { return x == fa[x] ? x : fa[x] = query(fa[x]); }
void bfs() {pre[1] = -1;dep[1] = 0;int l = 1, r = 0;que[++r] = 1;while (l <= r) {int u = que[l++];for (int i = 0; i < G[u].size(); i++) {int id = G[u][i];if (id == pre[u]) continue;int v = (u == edge[id].u ? edge[id].v : edge[id].u);pre[v] = id;dep[v] = dep[u] + 1;que[++r] = v;}}for (int i = 0; i < v2.size(); i++) {int id = v2[i];int u = edge[id].u, v = edge[id].v, cap = edge[id].cap;while (u != v) {if (dep[u] < dep[v]) swap(u, v);id = pre[u];edge[id].cap += cap;u = (u == edge[id].u ? edge[id].v : edge[id].u);}}
}
void solve() {scanf("%d%d", &n, &m);init();for (int i = 1; i <= m; i++) scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].cap);sort(edge+1, edge+1+m);for (int i = 1; i <= m; i++) {int u = edge[i].u, v = edge[i].v;int x = query(u), y = query(v);if (x != y) {fa[x] = y;G[u].push_back(i);G[v].push_back(i);v1.push_back(i);}else {v2.push_back(i);}}bfs();sort(v1.begin(), v1.end(), cmp);int bit = 0;for (; (1<<bit) <= n; bit++);for (int i = 1; i <= n; i++) {sz[i] = 1;for (int j = 0; j < bit; j++) {cnt1[i][j] = (i>>j) & 1;}}for (int i = 0; i <= n; i++) fa[i] = i;ull ans = 0;for (int i = 0; i < v1.size(); i++) {int id = v1[i];int u = edge[id].u, v = edge[id].v, cap = edge[id].cap;int x = query(u), y = query(v);fa[x] = y;for (int j = 0; j < bit; j++) {if ((cap>>j) & 1) {ans += (1LL * (sz[x]-cnt1[x][j])*(sz[y]-cnt1[y][j]) + cnt1[x][j]*cnt1[y][j]) * (1LL<<j);}else {ans += (1LL * (sz[x]-cnt1[x][j])*cnt1[y][j] + cnt1[x][j]*(sz[y]-cnt1[y][j])) * (1LL<<j);}cnt1[y][j] += cnt1[x][j];}ans += 1LL * sz[x] * sz[y] * ((cap>>bit)<<bit);sz[y] += sz[x];}printf("%llu\n", ans);
}
int main() {int T;scanf("%d", &T);while (T--) solve();return 0;
}

 


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

相关文章

HDU 6350 Always Online (仙人掌图,最大流)

传送门 这道题真的是坑&#xff0c;竟然用ull&#xff0c;ll都会爆。 首先这是一个仙人掌图。题意让求任意两点最大流&#xff0c;再进行异或。先说最大流&#xff0c;对于环上任意两点最大流&#xff0c;就是两条路径最小的边和&#xff0c;这就等效于求出环中最小的边&…

MTK Android5.1 单独调整主副麦的模拟增益PGA(MT6350_PMIC)

MTK Android5.1 单独调整主副麦的模拟增益PGA&#xff08;MT6350_PMIC&#xff09; 项目使用副麦消噪&#xff0c;但是副麦增益太小&#xff0c;需要单独修改副麦增益&#xff0c;使用工程模式APP和Audio Tuning Tool调整的MIC的Level4的值&#xff0c;都会同时调整主麦和副麦…

HDU 6350 Always Online(最大流+并查集)

Description 给出一个 n n 个点m" role="presentation" style="position: relative;">mm条边的无向图&#xff0c;任意两点之间至多两条路径&#xff0c;以 flow(s,t) f l o w ( s , t ) 表示 s,t s , t 两点之间的最大流&#xff0c;求 ∑1≤s&l…

zabbix通过SNMP V3监控华为防火墙USG6350

1.华为防火墙开启snmp V3(图形界面配置) 防火墙接口开启SNMP服务&#xff08;找到通往zabbix服务器的那个网络接口或VLAN&#xff0c;这步很重要&#xff01;&#xff09; 找到通往zabbix服务器的那个网络接口或VLAN 防火墙配置完成&#xff01; 2.配置zabbix服务器端 yum …

USG 6350 SFTP 配置

进入视图模式 system-view interface GigabitEthernet 1/0/0 service-manage ssh permit service-manage enable 启用 sftp sftp server enable VTY认证 user-interface vty 0 4 authentication-mode aaa protocol inbound ssh user privilege level 3 新建用户名为SFTP的…

[Linux Audio Driver] SM6350平台音频bring up ( 一 )

0. 背景 这个是高通5G平台&#xff0c;音频的内容改的比较多&#xff0c;比较直接的是platform.c就直接移动到vendor了&#xff1b;目前 高通那边的趋势还是把音频逐渐从kernel剥离&#xff0c;android 7/android 8的时候&#xff0c;machine driver&#xff0c;codec driver都…

华为USG6350防洪墙SNMP最简单功能配置

https://www.cnblogs.com/vincent-liang/p/7785089.html

spring cloud搭建(service)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…