How Many to Be Happy?
How Many to Be Happy?
时间限制: 1 Sec 内存限制: 128 MB
题目描述

Consider the graph in Figure E.1. There are 3 nodes and 3 edges connecting the nodes. One can easily see that the MST for this graph includes the 2 edges with weights 1 and 2, so the 2 edges are happy in the graph. How to make the edge with weight 3 happy? It is obvious that one can remove any one of the two happy edges to achieve that.
Given a connected simple undirected graph G, your task is to compute H(e) for each edge e in G and print the total sum.
输入
输出
样例输入
- 3 3
- 1 2 1
- 3 1 2
- 3 2 3
样例输出
- 1
来源/分类
ICPC 2017 Daejeon
最小生成树的MST性质的应用。我们想让某一条边一定是最小生成树中的边,只要找到任意一种点集的分配,使得这条边的两个顶点在不同的分配中且边权是连接这两个分配的所有边中最小的那一个。显然只有边权比它小的边才会影响它是不是在最小生成树中。于是我们可以只在图中保留边权小于当前边权的边,看看是否能找到一种点集的分配。显然当这个边的两个顶点在新图中仍然连通时,我们找不到这种分配,于是就需要砍掉若干边使两顶点不连通,于是题目就转化为了最小割问题。
- #include<bits/stdc++.h>
- #define INF LLONG_MAX/2
- #define N 505
- using namespace std;
- struct ss
- {
- int v,next;
- long long flow;
- };
- int head[N],now_edge=,S,T;
- ss edg[N*];
- void init()
- {
- now_edge=;
- memset(head,-,sizeof(head));
- }
- void addedge(int u,int v,long long flow)
- {
- edg[now_edge]=(ss){v,head[u],flow};
- head[u]=now_edge++;
- edg[now_edge]=(ss){u,head[v],flow};
- head[v]=now_edge++;
- }
- int dis[N];
- int bfs()
- {
- memset(dis,,sizeof(dis));
- queue<int>q;
- q.push(S);
- dis[S]=;
- while(!q.empty())
- {
- int now=q.front();
- q.pop();
- for(int i=head[now];i!=-;i=edg[i].next)
- {
- ss &e=edg[i];
- if(e.flow>&&dis[e.v]==)
- {
- dis[e.v]=dis[now]+;
- q.push(e.v);
- }
- }
- }
- if(dis[T]==)return ;
- return ;
- }
- int current[N];
- long long dfs(int x,long long maxflow)
- {
- if(x==T)return maxflow;
- for(int i=current[x];i!=-;i=edg[i].next)
- {
- current[x]=i;
- ss &e=edg[i];
- if(e.flow>&&dis[e.v]==dis[x]+)
- {
- long long flow=dfs(e.v,min(maxflow,e.flow));
- if(flow!=)
- {
- e.flow-=flow;
- edg[i^].flow+=flow;
- return flow;
- }
- }
- }
- return ;
- }
- long long dinic()
- {
- long long ans=,flow;
- while(bfs())
- {
- for(int i=;i<N;i++)current[i]=head[i];
- while(flow=dfs(S,INF))ans+=flow;
- }
- return ans;
- }
- int from[N],to[N],w[N];
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
- for(int i=;i<=m;i++)
- {
- scanf("%d %d %d",&from[i],&to[i],&w[i]);
- }
- int ans=;
- for(int i=;i<=m;i++)
- {
- init();
- for(int j=;j<=m;j++)
- if(w[j]<w[i])addedge(from[j],to[j],);
- S=from[i];
- T=to[i];
- ans+=dinic();
- }
- printf("%d\n",ans);
- return ;
- }
随机推荐
- 1143: [CTSC2008]祭祀river
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4018 Solved: 2048[Submit][Status][Discuss] Descript ...
- iView - Form中想要重置DatePicker生效,必须给DatePicker绑定value属性
Form中想要重置DatePicker生效,必须给DatePicker绑定value属性
- mysql零散操作
添加对外用户 CREATE USER 'admin'@'%' IDENTIFIED BY '!QAZ2wsx'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'; ...
- hprose 1.0(rpc 框架) - 内部数据标准
hprose 1.0 内部数据标准 方法的描述 { // 请求调用格式 'C'.writeString('method1').'a'.count($params).'{'.'m'.cou ...
- python3爬虫之Urllib库(二)
在上一篇文章中,我们大概讲了一下urllib库中最重要的两个请求方法:urlopen() 和 Request() 但是仅仅凭借那两个方法无法执行一些更高级的请求,如Cookies处理,代理设置等等 ...
- 721. Accounts Merge
https://leetcode.com/problems/accounts-merge/description/ class UnionFound { public: unordered_map&l ...
- winform中使用webBrowser时如何与JS交互
最近写一个GEPlugin项目,要用到geWebBrowser与JS进行交互. 这个geWebBrowser的事件 private void geWebBrowser1_DocumentComplet ...
- tomcat8+idea远程调试
window下 setenv.bat增加 set JPDA_OPTS=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n lin ...
- spoj 104 Highways(Matrix-tree定理)
spoj 104 Highways 生成树计数,matrix-tree定理的应用. Matrix-tree定理: D为无向图G的度数矩阵(D[i][i]是i的度数,其他的为0),A为G的邻接矩阵(若u ...
- P2615 神奇的幻方
P2615 神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首 ...