HDU 4635 Strongly connected(强连通)经典
Strongly connected
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1828 Accepted Submission(s): 752
A simple directed graph is a directed graph having no multiple edges or graph loops.
A strongly connected digraph is a directed graph in which it is possible to reach any node starting from any other node by traversing edges in the direction(s) in which they point.
Then T cases follow, each case starts of two numbers N and M, 1<=N<=100000, 1<=M<=100000, representing the number of nodes and the number of edges, then M lines follow. Each line contains two integers x and y, means that there is a edge from x to y.
If the original graph is strongly connected, just output -1.
3 3 3 1 2 2 3 3 1 3 3 1 2 2 3 1 3 6 6 1 2 2 3 3 1 4 5 5 6 6 4
Case 1: -1 Case 2: 1 Case 3: 15
假设一開始就是一个强连通图。则输出-1。
由于假设不减入度为0或出度为0相关的边,那么该点本身包括有入边和出边。加的边永远都是强连通图。所以仅仅能去掉与入度为0或出度为0点的相关边,仅仅减掉一个方向的边,要么全是(n-minnum)点数到minnum点数的入边,那么是minnum点数到(n-minnum)点数的出边。
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- #define ll __int64
- const int N = 100005;
- struct EDG{
- int to,next;
- }edg[N];
- int eid,head[N];
- int low[N],dfn[N],vist[N],num[N],id[N],deep,stack1[N],tn,top;
- int in[N],out[N];
- void init(){
- eid=tn=top=deep=0;
- memset(head,-1,sizeof(head));
- memset(vist,0,sizeof(vist));
- memset(in,0,sizeof(in));
- memset(out,0,sizeof(out));
- memset(num,0,sizeof(num));
- }
- void addEdg(int u,int v){
- edg[eid].to=v; edg[eid].next=head[u]; head[u]=eid++;
- }
- void tarjer(int u){
- stack1[++top]=u;
- vist[u]=1;
- deep++;
- low[u]=dfn[u]=deep;
- for(int i=head[u]; i!=-1; i=edg[i].next){
- int v=edg[i].to;
- if(vist[v]==0){
- vist[v]=1;
- tarjer(v);
- low[u]=min(low[u],low[v]);
- }
- else if(vist[v]==1)
- low[u]=min(low[u],dfn[v]);
- }
- if(low[u]==dfn[u]){
- tn++;
- do{
- vist[stack1[top]]=2;
- num[tn]++;
- id[stack1[top]]=tn;
- }while(stack1[top--]!=u);
- }
- }
- ll solve(int n,int m){
- ll ans=n*(n-1)-m;
- int minnum=N;
- for(int i=1; i<=n; i++)
- if(vist[i]==0)
- tarjer(i);
- if(tn==1) return -1;
- for(int u=1; u<=n; u++)
- for(int i=head[u]; i!=-1; i=edg[i].next){
- int v=edg[i].to;
- if(id[u]!=id[v])
- in[id[v]]++,out[id[u]]++;
- }
- for(int i=1; i<=tn; i++)
- if(in[i]==0||out[i]==0){
- minnum=min(minnum,num[i]);
- }
- ans-=minnum*(n-minnum);
- return ans;
- }
- int main(){
- int T,n,m,c=0,a,b;
- scanf("%d",&T);
- while(T--){
- scanf("%d%d",&n,&m);
- init();
- for(int i=1; i<=m; i++)
- {
- scanf("%d%d",&a,&b);
- addEdg(a,b);
- }
- printf("Case %d: %I64d\n",++c,solve(n,m));
- }
- }
HDU 4635 Strongly connected(强连通)经典的更多相关文章
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- HDU 4635 Strongly connected (强连通分量)
题意 给定一个N个点M条边的简单图,求最多能加几条边,使得这个图仍然不是一个强连通图. 思路 2013多校第四场1004题.和官方题解思路一样,就直接贴了~ 最终添加完边的图,肯定可以分成两个部X和Y ...
- hdu 4635 Strongly connected 强连通
题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...
- HDU 4635 Strongly connected (强连通分量+缩点)
<题目链接> 题目大意: 给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边. 解题分析: 我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其 ...
- HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】
Strongly connected Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4635 Strongly connected (Tarjan+一点数学分析)
Strongly connected Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- hdu 4635 Strongly connected(强连通)
考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...
- HDU 4635 Strongly connected(强连通分量,变形)
题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...
随机推荐
- re——正则表达式
常用的表达式规则 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r&q ...
- Python学习-day10 进程
学习完线程,学习进程 进程和线程的语法有很多一样的地方,不过在操作系统中的差别确实很大. 模块是threading 和 multiprocessing 多进程multiprocessing multi ...
- 浮动 float
1.未设浮动属性,位于标准流中 2.如果设置浮动属性,则容器不再位于标准流中,不再占用空间.容器会根据内容确定宽度 3.尽量将搜索引擎要搜索的内容放到网页的前部,更要容易排名到 4.clear属性清除 ...
- [python subprocess学习篇] 调用系统命令
http://www.jb51.net/article/57208.htm 3).Popen.communicate(input=None):与子进程进行交互.向stdin发送数据,或从stdout和 ...
- 是男人就过 8 题--Pony.AI A AStringGame
链接:https://www.nowcoder.com/acm/contest/92/A来源:牛客网 AStringGame 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 26214 ...
- 九度oj 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...
- Spring 依赖注入(一、注入方式)
首先装配一个实体类People package com.maya.model; public class People { private int id; private String name; p ...
- Ubuntu12.04 64bit版本下载Android源码完整教程
首先去官网http://source.android.com/source/initializing.html可以看到完整的安装教程.不过一般情况下,按照这个教程是无法一步到位的,因为中途肯定会遇到很 ...
- TroubleShoot:网站设置找不到术语管理
在SharePoint站点中找不到“术语管理”这个链接功能. 解决方案: Enable-SPFeature -id “73EF14B1-13A9-416b-A9B5-ECECA2B0604C” -Ur ...
- SEO总结(一)