题意:给一个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)的更多相关文章

  1. HDU 4635 Strongly connected (Tarjan+一点数学分析)

    Strongly connected Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  2. HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)

    t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...

  3. hdu 4635 Strongly connected(强连通)

    考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...

  4. HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)

    Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. HDU 4635 Strongly connected ——(强连通分量)

    好久没写tarjan了,写起来有点手生,还好1A了- -. 题意:给定一个有向图,问最多添加多少条边,让它依然不是强连通图. 分析:不妨考虑最大时候的临界状态(即再添加一条边就是强连通图的状态),假设 ...

  6. HDU 4635 Strongly connected(强连通分量,变形)

    题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...

  7. HDU 4635 Strongly connected(强连通分量缩点+数学思想)

    题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...

  8. HDU 4635:Strongly connected(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给出n个点和m条边,问最多能添加几条边使得图不是一个强连通图.如果一开始强连通就-1.思路:把图分成 ...

  9. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

随机推荐

  1. Hibernate(五)——面向对象查询语言和锁

    Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hi ...

  2. 在Unity3d编辑器中加入菜单以及菜单项

    在引用UZGUI插件时,u3d编辑器的菜单条发生了变化,新增了菜单和菜单项,于是乎自己也像尝试一下,看了EZGUI的About_EZ_GUI脚本文件后,结果大出我所料,原来SO EASY! using ...

  3. JavaScript-------寄生组合式继承

    组合继承在前面有说过,也是JavaScript中最常用的一个继承模式:不过,它也有自己的不足.组合继承最大的问题就是无论什么情况,都会调用两次构造函数: 那我们来回顾下组合式继承基本模式: funct ...

  4. hbase权威指南学习笔记--架构--存储

    HBase主要处理两种文件:预写日志(Write-Ahead Log,WAL),实际的数据文件. 一个基本的流程是客户端首先联系ZooKeeper子集群查找行健数据所在的region服务器名.(通过Z ...

  5. .net下载

    1,Http 协议中有专门的指令来告知浏览器, 本次响应的是一个需要下载的文件. 格式如下: Content-Disposition: attachment;filename=filename.ext ...

  6. Xcode no visible @interface for xxx declares the selector errors

  7. jQuery Moblile Demos学习记录Theming、Button、Icons图标,脑子真的不好使。

    jQuery Moblile Demos学习记录Theming.Button.Icons图标,脑子真的不好使. 06. 二 / Jquery Mobile 前端 / 没有评论   本文来源于www.i ...

  8. 三星ssd转移系统

    1. (正常模式)如果源磁盘小于目标磁盘   第 1 步 . 开始迁移   第 2 步 . 连接目标磁盘  ① 目标磁盘连接后,其状态会显示在屏幕上.  ※ 如果您要连接 mSATA 产品,那么还需要 ...

  9. activiti笔记三 Activiti问题重现

    测试的时候出现一个异常: ContextLoader.initWebApplicationContext(308) | Context initialization failed org.spring ...

  10. 域名变更后获取cookie

    有个朋友问我,域名更换后怎么获取原有域名下的cookie,当时第一反应是域名都不存在还怎么获取cookie. 后面想想似乎是可以的,使用新域名后可以保留原有域名,通过jsonp或iframe跨域获取原 ...