hdu4635 有向图最多添加多少边使图仍非强连通
思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中入度的点,若不添加入度,则必然不连通,同理出度为0的也一样,所以,找入度/出度为0的点中, ki(n-ki)最小的,这里KI是缩点后该SCC中的点数量,这个结果就是最小去掉的边数了。
思路清晰,1A。
- #include<iostream>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<stack>
- using namespace std;
- int n,m;
- const int maxv=100030;
- vector<vector<int> >edges(maxv);
- int visited[maxv]; int low[maxv]; int dfn[maxv];
- int ind[maxv]; int outd[maxv]; int sccnum[maxv];
- int scc[maxv];
- int num;int times;
- stack<int>s;
- int instack[maxv];
- void tarjan(int u)
- {
- low[u]=dfn[u]=times++;
- instack[u]=1;
- s.push(u);
- int len=edges[u].size();
- for(int i=0;i<len;i++)
- {
- int v=edges[u][i];
- if(visited[v]==0)
- {
- visited[v]=1;
- tarjan(v);
- if(low[u]>low[v])low[u]=low[v];
- }
- else if(instack[v]&&low[u]>dfn[v])
- {
- low[u]=dfn[v];
- }
- }
- if(dfn[u]==low[u]) //在一个SCC
- {
- num++;int temp;int snum=0;
- do
- {
- snum++;
- temp=s.top();
- instack[temp]=0;
- s.pop();
- scc[temp]=num;
- } while(temp!=u);
- sccnum[num]=snum;
- }
- }
- void readin() //读入数据
- {
- scanf("%d%d",&n,&m);
- int a,b;
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d",&a,&b);
- edges[a].push_back(b);
- }
- }
- void initialize()
- {
- num=times=0;
- for(int i=0;i<=100000;i++)
- {
- dfn[i]=low[i]=ind[i]=outd[i]=visited[i]=sccnum[i]=scc[i]=0;
- edges[i].clear();
- }
- }
- int solve()
- {
- for(int i=1;i<=n;i++)
- if(visited[i]==0)
- {
- visited[i]=1;
- tarjan(i);
- }
- if(num==1){return -1;}
- for(int i=1;i<=n;i++)
- {
- int len=edges[i].size();
- for(int j=0;j<len;j++)
- {
- int v=edges[i][j];
- if(scc[v]!=scc[i])
- {
- outd[scc[i]]++;
- ind[scc[v]]++;
- }
- }
- }
- int mincut=1000000000;
- for(int i=1;i<=num;i++)
- {
- int temp=0;
- if(outd[i]==0||ind[i]==0)
- {
- temp=sccnum[i]*(n-sccnum[i]);
- if(temp<mincut)mincut=temp;
- }
- }
- return n*(n-1)-m-mincut;
- }
- int main()
- {
- int T;
- cin>>T;int cases=1;
- while(T--)
- {
- initialize();
- readin();
- int ans=solve();
- printf("Case %d: %d\n",cases++,ans);
- }
- return 0;
- }
hdu4635 有向图最多添加多少边使图仍非强连通的更多相关文章
- poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11047 Accepted: 4725 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
- Strongly connected HDU - 4635 原图中在保证它不是强连通图最多添加几条边
1 //题意: 2 //给你一个有向图,如果这个图是一个强连通图那就直接输出-1 3 //否则,你就要找出来你最多能添加多少条边,在保证添加边之后的图依然不是一个强连通图的前提下 4 //然后输出你最 ...
- Android -- FragmentActivity添加Fragment的序列图
FragmentActivity添加Fragment的序列图
- Android 如何添加一个apk使模拟器和真机都编译进去 m
添加一个apk都需要将LOCAL_PACKAGE_NAME的值添加到PRODUCT_PACKAGES才行.而PRODUCT_PACKAGES一般在build/target/product/目录下的文件 ...
- HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】
Strongly connected Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- LoadRunner添加Weblogic监控的注意事项(非单纯的操作步骤)
LoadRunner添加Weblogic监控的注意事项(非单纯的操作步骤) 关于LR如何监控Weblogic(JMX方式)的操作就不在这里多说了,帮助文件和网上的介绍已经非常多了,关键是对各操作步 ...
- hdu4635(最多加多少边,使得有向图不是强连通图)
连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...
- POJ 1236--Network of Schools【scc缩点构图 && 求scc入度为0的个数 && 求最少加几条边使图变成强联通】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13325 Accepted: 53 ...
随机推荐
- Linux-Java安装
安装 yum -y install java-1.8.0-openjdk* Tomcat安装:到官网http://tomcat.apache.org/,然后找到Tomcat9下载地址 http://m ...
- LeetCode之Weekly Contest 91
第一题:柠檬水找零 问题: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 ...
- destoon 数据库操作
1.插入数据 $db->query("INSERT INTO ".get_table($mid)." ($sqlk) VALUES ($sqlv)"); ...
- DeepFaceLab小白入门(4):提取人脸图片!
通过上面级片文章,你应该基本知道了换脸的流出,也能换出一个视频来.此时,你可能会产生好多疑问,比如每个环节点点到底是什么意思,那些黑漆漆屏幕输出的又是什么内容,我换脸效果这么差,该如何提升?等等,好奇 ...
- 【android】android对位图文件的支持
Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).
- Lecture 2
1. Coordinate(坐标) data for GIS real coordinate system:Cartesian coordinate systems(笛卡尔坐标系) from 3D t ...
- Python PycURL的安装使用
PycURL中文简介:https://blog.csdn.net/qq_41185868/article/details/80487014 PycURL英文简介(如下):http://pycurl.i ...
- R-codes-tips
1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2. 载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...
- 深入理解FIFO(包含有FIFO深度的解释)——转载
深入理解FIFO(包含有FIFO深度的解释) FIFO: 一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行 ...
- poj-1979 red and black(搜索)
Time limit1000 ms Memory limit30000 kB There is a rectangular room, covered with square tiles. Each ...