hdu 4635 Strongly connected (tarjan)
题意:给一个n个顶点m条弧的简单有向图(无环无重边),求最多能够加入多少条弧使得加入后的有向图仍为简单有向图且不是一个强连通图。假设给的简单有向图本来就是强连通图,那么输出-1.
分析:
1.用tarjan算法求出强连通分量的个数,假设个数为1,那么输出-1,结束,否则运行2
2.如果将一些强连通分量合并为有n1个顶点简单全然图1,而将剩下的强连通分量合并为n2个顶点的简单全然图2,跨这两个简单全然图的弧的方向仅仅能是单向的,如果m1为全然图1内部的弧的数量,m2为为全然图2内部的弧的数量。m3为跨这两个简单全然图的弧的数量,那么
ans=n1*(n1-1)-m1+n2*(n2-1)-m2+n1*n2-m3 ----------------------------------------------------1式
n1+n2=n ----------------------------------------------------2式
m1+m2+m3=m ----------------------------------------------------3式
n*n=(n1+n2)(n1+n2)=n1*n1+n2*n2+2*n1*n2 -----------------------------------------------------4式
所以
ans=n*n-m-n-n1*n2=n*n-m-n-n1*(n-n1)
ans要最大,所以n1*(n-n1)要最小。同一时候要跨图1。图2的弧要单向,
所以在跨图1,图2的弧要单向的情况下。n1尽量小。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100005
#define INF 1<<30
using namespace std; typedef struct ArcNode
{
int adjvex;//该弧所指向的顶点的位置
struct ArcNode * nextarc;//指向下一条弧的指针
} ArcNode; typedef struct VNode
{
int vertex;
//int In_deg,Out_deg;
int belong;
ArcNode * firstarc;
} VNode; VNode V[MAX];
int DFN[MAX],Stack[MAX],low[MAX];
int top,index,bcnt;
bool instack[MAX];
long long n,m;
int Min;
int cnt;
int k;
int edge[MAX][2]; void init()
{
int a,b;
ArcNode * p;
for(int i=1; i<=n; i++)
{
V[i].vertex=i;
//V[i].In_deg=V[i].Out_deg=0;
V[i].firstarc =NULL;
}
for(int i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
// V[a].Out_deg++;
// V[b].In_deg++;
edge[i][0]=a;
edge[i][1]=b;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex =b;
p->nextarc =V[a].firstarc ;
V[a].firstarc =p;
}
} void DFS_tarjan(int i)
{
int j;
ArcNode * p;
DFN[i]=low[i]=++index;
Stack[++top]=i;
instack[i]=true;
p=V[i].firstarc ;
while(p!=NULL)
{
j=p->adjvex;
if(!DFN[j])
{
DFS_tarjan(j);
if(low[j]<low[i])//Low(u)为u的子树可以追溯到的最早的栈中节点的次序号
low[i]=low[j];
}
else if(instack[j]&&DFN[j]<low[i])//Low(u)为u可以追溯到的最早的栈中节点的次序号
low[i]=DFN[j];
p=p->nextarc;//
}
if(DFN[i]==low[i])
{
bcnt++;
cnt=0;
int INDEG=0;
int OUTDEG=0;
do
{
j=Stack[top--];//出栈,j是为该强连通分量中一个顶点
instack[j]=false;
//INDEG+=V[j].In_deg;
//OUTDEG+=V[j].Out_deg;
V[j].belong=bcnt;
cnt++;
}
while(i!=j);
for(int kkk=0;kkk<m;kkk++)
{
if(V[edge[kkk][0]].belong==bcnt&&V[edge[kkk][1]].belong!=bcnt)
{
OUTDEG++;
}
if(V[edge[kkk][0]].belong!=bcnt&&V[edge[kkk][1]].belong==bcnt)
INDEG++;
}
if(Min>cnt&&(INDEG==0||OUTDEG==0))
{
Min=cnt;
}
}
} void FREE()
{
ArcNode * p;
ArcNode * q;
for(int i=1; i<=n; i++)
{
p=V[i].firstarc;
while(p!=NULL)
{
q=p;
p=p->nextarc;
free(q);
}
}
} void solve()
{
int i;
top=index=bcnt=0;
memset(DFN,0,sizeof(DFN));
memset(instack,false,sizeof(instack));
for(i=1; i<=n; i++)
{
if(!DFN[i])
DFS_tarjan(i);
}
//printf("%d\n",bcnt);
FREE();
if(bcnt==1)
{
printf("Case %d: -1\n",k);
return;
}
long long ans=n*n-n-m-(Min*(n-Min));
//printf("%d\n",Min);
printf("Case %d: %lld\n",k,ans);
} int main()
{
int t;
scanf("%d",&t);
for(k=1; k<=t; k++)
{
scanf("%lld%lld",&n,&m);
Min=INF;
init();
solve();
}
return 0;
}
hdu 4635 Strongly connected (tarjan)的更多相关文章
- HDU 4635 Strongly connected (Tarjan+一点数学分析)
Strongly connected Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)
t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...
- hdu 4635 Strongly connected(强连通)
考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...
- 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了,写起来有点手生,还好1A了- -. 题意:给定一个有向图,问最多添加多少条边,让它依然不是强连通图. 分析:不妨考虑最大时候的临界状态(即再添加一条边就是强连通图的状态),假设 ...
- HDU 4635 Strongly connected(强连通分量,变形)
题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...
- HDU 4635 Strongly connected(强连通分量缩点+数学思想)
题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...
- HDU 4635:Strongly connected(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给出n个点和m条边,问最多能添加几条边使得图不是一个强连通图.如果一开始强连通就-1.思路:把图分成 ...
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
随机推荐
- springmvc工作原理和环境搭建
SpringMVC工作原理 上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServle ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- DE2带的IP核ISP12362报错问题解决 Error:avalon_slave_1_irq: associatedAddressablePoint out of range
问题来源与对友晶提供的ISP1362 IP核的使用,由于Quartus II版本问题,它提供的IP基于7.0版本,而我用的版本为11.1,在SOPC Builder中重新加载IP,就出现了上述的错误报 ...
- 解决jquery和其他库的冲突
一.jquery在其他库之后导入 (1)jQuery.noConflict(); //将变量的$控制权转交给其他库. jQuery(function(){ ...
- AJAX 控件集之TextBoxWatermark(水印文本框)控件
功能: 可以让TextBox控件初始化的时候拥有水印文字.属性: TargetControlID :要使用具有水印效果的TextBox控件ID. WatermarkCssCla ...
- ResourceBundle读取中文properties文件问题
昨天遇到一个问题,用ResourceBundle读取中文字符串资源文件时,死活读不出来. 一开始以为是文件路径不对,后来发现如果默认properties文件时英文就没问题.我的项目代码是在src目录下 ...
- hdu 1587
Problem Description As you know, Gardon trid hard for his love-letter, and now he's spending too muc ...
- Performing Post-Build Event之类的编译错误
如果编译出现Perror PRJ0019: A tool returned an error code from "Performing Post-Build Event..."之 ...
- UltraEdit v17.10.0,注册机,注册码
1,UltraEdit注册机 :点击下载 2,断掉网络,进入UltraEdit软件,依次点击:帮助——注册/激活——激活,会提示你进行脱机激活,点击脱机激活后,将用户码1和用户码2 分别输入注册机的u ...
- JavaScript 全局变量命名空间生成函数
<script type="text/javascript"> var GLOBAL = {}; GLOBAL.namespace = function(str){ v ...