博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4635 Strongly connected (tarjan)
阅读量:6191 次
发布时间:2019-06-21

本文共 2731 字,大约阅读时间需要 9 分钟。

题意:给一个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
#include
#include
#define MAX 100005#define INF 1<<30using 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
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]
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
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;}

转载地址:http://bqeda.baihongyu.com/

你可能感兴趣的文章
图解DevExpress RichEditControl富文本的使用,附源码及官方API
查看>>
ubuntu 学习笔记
查看>>
BNU 34986 Football on Table
查看>>
三级联动---城市地区选择
查看>>
闪回flashback#ocp试验#
查看>>
webpack插件html-webpack-plugin
查看>>
软件设计的复杂度
查看>>
无法从使用方法中推导出方法... 的类型实參,请尝试显式指定类型实參
查看>>
axios学习笔记
查看>>
Git各种错误操作撤销的方法
查看>>
剖析 Laravel 计划任务--避免重复
查看>>
公司框架遇到的问题
查看>>
详解 Discuz 的 PHP经典加密解密函数 authcode
查看>>
vmware station中 UDEV 无法获取共享存储磁盘的UUID,症状: scsi_id -g -u -d /dev/sdb 无返回结果。...
查看>>
Mysql XX 天之内
查看>>
Liferay 启动过程分析16-初始化插件
查看>>
构建插件式的应用程序框架(四)----服务容器
查看>>
AE创建气泡式的提示框(VB.Net和C#源码)
查看>>
百度K站解封之道(真实案例)
查看>>
KSFramework常见问题:Excel如何进行SVN协作、差异比较?
查看>>