[HDU - 6350] Always Online

news/2024/12/22 3:01:11/

题目链接

https://vjudge.net/contest/252211#problem/A

题目大意

T组数据 (T100) ( T ≤ 100 ) , 给出一个n个点m条边的无向图 (1n105,n1m32(n1)) ( 1 ≤ n ≤ 10 5 , n − 1 ≤ m ≤ 3 2 ( n − 1 ) ) , 每条边有容量 wi(1wi109) w i ( 1 ≤ w i ≤ 10 9 ) , 图中最多存在两条完全不相交的路径,图连通, 无自环重边。求 s<tstflow(s,t) ∑ s < t s ⊕ t ⊕ f l o w ( s , t ) (n106) ( ∑ n ≤ 10 6 )

题目思路

最多存在两条完全不相交的路径等价于每条边最多属于一个环上。
最大流等于最小割, 考虑割边。
由原图特性, s->t的路径构成为若干个环和一些边。
对于一个简单环, 割边一定是个其中两条边, 且一定包含环上最小的那条边。
对于若干个环加一些边组合在一起, 割边一定是某个环上的两条边或是一条单独的非环边。
将环上的边作特殊处理, 考虑到如果要割的话最小的那条边一定被割, 所以将每个环删去最小边, 将容量加在环上的其他边的上, 不会影响答案。
最后留下一棵树, 考虑从大到小加入每条边, 则新连通的这两个集合之间的最小割即为这条边的容量, 用并查集维护集合中每个二进制位为1的个数, 每次合并之前计算一次贡献即可。

Code

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>#define ll long long
#define ull unsigned ll using namespace std;const int N = (int)1e5 + 10;
const int M = (int)1e6 + 10;int n, m;
int cnt, lst[N], nxt[M], to[M], edg[M][3], id[M], del[M];
int gi(){char c = getchar(); int ret = 0;while (!isdigit(c)) c = getchar();while (isdigit(c)){ret = ret * 10 + c - '0';c = getchar();}return ret;
}
void add(int u, int v, int c){nxt[++ cnt] = lst[u]; lst[u] = cnt; to[cnt] = v;nxt[++ cnt] = lst[v]; lst[v] = cnt; to[cnt] = u; 
}int indx, pre[N], dfn[N]; bool vis[N];
void dfs(int u, int pid){vis[u] = 1; dfn[u] = ++ indx;for (int j = lst[u]; j; j = nxt[j]){if (pid == (j / 2)) continue;int v = to[j];if (!vis[v]) {pre[v] = j; dfs(v, j / 2);}else if(dfn[v] < dfn[u]){int wid = j / 2;for (int p = u; p != v; p = to[pre[p] ^ 1]){int k = pre[p] / 2;if (edg[wid][2] > edg[k][2]) wid = k;}del[wid] = 1;for (int p = u; p != v; p = to[pre[p] ^ 1]){int k = pre[p] / 2;if (k == wid) continue;edg[k][2] += edg[wid][2];}if (j / 2 != wid){if (j / 2 != wid){edg[j / 2][2] += edg[wid][2];}}}}
}int fa[N], bit[N][30], sz[N];
int find(int x){if (fa[x] == x) return x;return fa[x] = find(fa[x]);
}
void unit(int r1, int r2){r1 = find(r1), r2 = find(r2);if (r1 != r2){fa[r1] = r2;for (int j = 0; j < 20; j ++)bit[r2][j] += bit[r1][j];sz[r2] += sz[r1];}
}
bool cmp(int i, int j){return edg[i][2] > edg[j][2];}int main()
{int T = gi();while (T --){n = gi(), m = gi();cnt = 1;for (int i = 1, u, v, c; i <= m; i ++){u = gi(), v = gi(), c = gi();add(u, v, c);edg[i][0] = u, edg[i][1] = v; edg[i][2] = c;}dfs(1, 0);for (int i = 1; i <= m; i ++) id[i] = i;for (int i = 1; i <= n; i ++){fa[i] = i;for (int j = 0; j < 20; j ++) bit[i][j] = (i >> j) & 1;sz[i] = 1;}sort(id + 1, id + m + 1, cmp);ull ans = 0;for (int iid = 1; iid <= m; iid ++){int i = id[iid];if (del[i]) continue;int u = edg[i][0], v = edg[i][1];u = find(u), v = find(v);if (u != v){int w = edg[i][2];for (int j = 0; j < 20; j ++){if ((w >> j) & 1){ans += (ull)bit[u][j] * bit[v][j] * (1 << j);ans += (ull)(sz[u] - bit[u][j]) * (sz[v] - bit[v][j]) * (1 << j);}else{ans += (ull)(sz[u] - bit[u][j]) * bit[v][j] * (1 << j);ans += (ull)bit[u][j] * (sz[v] - bit[v][j]) * (1 << j);}}ans += (ull)(w >> 20) * sz[u] * sz[v] * (1 << 20);unit(u, v);}}printf("%llu\n", ans);for (int i = 1; i <= n; i ++) lst[i] = 0, pre[i] = 0, vis[i] = 0;for (int i = 1; i <= m; i ++) del[i] = 0;}return 0;
}

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

相关文章

Internet Explorer EPM沙盒跳出漏洞的分析(CVE-2014-6350)

blast 2014/12/04 9:42 0x00 前言 作者: James Forshaw 原文: 链接 这个月微软修复了3个不同的IE增强保护模式EPM的沙盒跳出漏洞&#xff0c;这些漏洞由我&#xff08;原作者&#xff0c;下同&#xff09;在8月披露。沙盒是Project Zero&#xff08;我也参加了&#xff09;中最…

pytest文档21-pytest-html报告优化(nodeid中文显示[\u6350\u52a9\u6211\u4eec]问题解决)

前言 pytest-html报告中当用到参数化时候&#xff0c;获取用例的nodeid里面有中文时候&#xff0c;会显示[\u6350\u52a9\u6211\u4eec]这种编码&#xff08;再次声明&#xff0c;这个不叫乱码&#xff0c;这是unicode编码&#xff09; 关于python2和python3里面Unicode编码转化…

【JZOJ6350】考试(test)

description analysis 对于\(n0\)的点&#xff0c;直接模拟就好了状压\(DP\)&#xff0c;设\(f[i][j][S]\)表示到第\(i\)题、连续\(GG\)了\(j\)题、喝的饮料集合为\(S\)的最大答案由于一题可以喝多瓶饮料所以转移需要枚举\(S\)的子集\(SS\)来转移然后转移比较显然但是细节恶心我…

Always Online hdu 6350

ps&#xff1a;今天真是石乐志&#xff0c;改了一下午bug&#xff0c;结果是忘了排序。。。。。。。。。。这题姿势较多&#xff0c;坑点就一个。 题解&#xff1a;有个结论&#xff0c;任意两点之间如果至多存在两条不相交路径&#xff0c;那么每一条边至多出现在一个环中&…

快狗打车开启招股:奇瑞、广发为基石,二者合计认购6350万美元

6月14日&#xff0c;快狗打车&#xff08;HK:02246&#xff09;在港交所发布公告&#xff0c;拟全球发售3120万股股份&#xff0c;其中香港发售股份312万股&#xff0c;国际发售股份2808万股&#xff0c;另有15%超额配股权。发售价将为每股发售股份21.5港元&#xff0c;预期股份…

hdu6350 /// tarjan+并查集+组合+最大流思想

题目大意&#xff1a; 给定n个点 m条边没有重边的仙人掌图&#xff08;没有一条边会同时存在与两个环 也就是环都是相互独立的&#xff09; 求任意两点间 i^j^maxflow(i,j)的总和 maxflow为两点间最大流 题解&#xff1a;https://blog.csdn.net/du_lun/article/details/8161062…

hdu - 6350

Topic 题目链接 Always Online Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 208 Accepted Submission(s): 66 Problem Description Wayne is an administrator of some metropolitan area network. The n…

HDU 6350 Always Online——仙人掌图

思路&#xff1a;把每个环的最小边去掉&#xff0c;加在环的其他边上&#xff0c;然后并查集跑一下就可以&#xff0c;跑的时候维护一下某位为1的点有多少个 #include <cstdio> #include <vector> #include <iostream> #include <algorithm> u…