hdu 4635 Strongly connected
http://acm.hdu.edu.cn/showproblem.php?pid=4635
我们把缩点后的新图(实际编码中可以不建新图 只是为了概念上好理解)中的每一个点都赋一个值
表示是由多少个点缩成的 我们需要找所有端点 也可能出发点(只有出度) 也可能是结束点 (只有入度)
这个端点和外界(其它所有点)的联通性是单向的(只入或只出) 也可能没有联通
在保持这个端点与外界的单向联通性的情况下 任意加边
所以 当端点的值越小(包含点越少) 结果越优
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<list>
#include<stack>
#include<queue>
using namespace std; typedef pair<int,int> pp;
typedef long long ll;
const int N=100005;
const int M=100005;
int head[N],I;
struct node
{
int j,next;
}edge[M];
int low[N],dfn[N],f[N],deep;
bool in[N],visited[N];
stack<int>st;
pp p[M];
void add(int i,int j)
{
edge[I].j=j;
edge[I].next=head[i];
head[i]=I++;
}
bool ok(vector<int>& vt)
{
for(unsigned int i=0;i<vt.size();++i)
{
int x=vt[i];
for(int t=head[x];t!=-1;t=edge[t].next)
{
int y=edge[t].j;
if(f[x]!=f[y])
return false;
}
}
return true;
}
void tarjan(int x,int &M)
{
visited[x]=true;
in[x]=true;
st.push(x);
low[x]=dfn[x]=deep++;
for(int t=head[x];t!=-1;t=edge[t].next)
{
int j=edge[t].j;
if(visited[j]==false)
{
tarjan(j,M);
low[x]=min(low[x],low[j]); }else if(in[j]==true)
{
low[x]=min(low[x],dfn[j]);
}
}
if(low[x]==dfn[x])
{
vector<int>vt; int tmp=1;
while(st.top()!=x)
{
int k=st.top(); st.pop();
vt.push_back(k);
in[k]=false;
f[k]=x;
++tmp;
} int k=st.top(); st.pop();
vt.push_back(k);
in[k]=false;
f[k]=x;
if(ok(vt))
{
M=min(M,tmp);
}
}
}
void init(int n,int m)
{
memset(head,-1,sizeof(head));
I=0;
for(int i=0;i<m;++i)
add(p[i].first,p[i].second);
}
int solve(int n,int m)
{
init(n,m);
while(!st.empty()) st.pop();
for(int i=1;i<=n;++i)
{f[i]=i;}
memset(in,false,sizeof(in));
memset(visited,false,sizeof(visited));
deep=0;
int k=n+1;
for(int i=1;i<=n;++i)
if(!visited[i])
tarjan(i,k);
return k;
}
int main()
{
//freopen("data.in","r",stdin);
int T;
scanf("%d",&T);
for(int ca=1;ca<=T;++ca)
{
printf("Case %d: ",ca);
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;++i)
scanf("%d %d",&p[i].first,&p[i].second);
int k=solve(n,m);
for(int i=0;i<m;++i)
swap(p[i].first,p[i].second);
k=min(solve(n,m),k);
if(k==n)
{cout<<"-1"<<endl;continue;}
ll ans=0;
ans=(ll)(n)*(ll)(n-1);
ans-=m;
ans-=(ll)(k)*(ll)(n-k);
cout<<ans<<endl;
}
return 0;
}
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 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- HDU 4635 Strongly connected (Tarjan+一点数学分析)
Strongly connected Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- 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(强连通)经典
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 4635 Strongly connected(强连通)
考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...
- HDU 4635 Strongly connected (强连通分量)
题意 给定一个N个点M条边的简单图,求最多能加几条边,使得这个图仍然不是一个强连通图. 思路 2013多校第四场1004题.和官方题解思路一样,就直接贴了~ 最终添加完边的图,肯定可以分成两个部X和Y ...
- HDU 4635 Strongly connected(强连通分量,变形)
题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...
- HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)
t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...
随机推荐
- objective-c第六章课后练习5
题5:用于翻转从终端输入数的各个位.然后修改这个程序,以便正确的输入负数. code: ,result_5 = ; NSLog(@"input num_5:"); scanf(&q ...
- Silverlight 限制 规则输入(正整数或小数)的另一种“技巧”写法
今天上午纠结一个问题很久,silverlight TextBox限制用户规则输入,要求只能输入正整数或则小数,小数点只能有且只有一个 刚开始的时候就是想直接用keyDown事件里面来解决 voi ...
- rocketmq简单搭建
摘要: 简单的部署管理RocketMQ队列 (nameserver broker在同一机器上) RocketMQ 是alibaba开源的消息队列. 本文使用的是开源版本v3.18 系统: centos ...
- Prince2和PMP的区别,大多数人都没有搞清楚!
[涨姿势]Prince2和PMP的区别,大多数人都没搞清楚! 项目管理领域有2个流行的知识体系:☑ 一个是美国项目管理协会(PMI)开发的"项目管理知识体系(PMBOK,Project ...
- Script循环语句 的相关知识跟练习
循环语句有两种问题类型:穷举和迭代 穷举: 在不知道什么情况下才是我们需要的结果的时候,只能让它一个一个的都执行一遍 迭代:在现有的条件下,根据规律,不断求解中间情况,最终推选出结果 两个关键词 br ...
- treegrid and datagrid ctrl or shift selectRow
var tg = $('#tg');tg.treegrid({...}); // create treegridvar panel = tg.treegrid('getPanel');var body ...
- 使用c#访问脚本里变量的方法
首先,把要获取的变量权限定义为public类型变量. 方法一.public GameObject 另一个物体; //监视面板拖拽赋值 另一个物体.GetComponent<脚本>() ...
- Logistic回归模型和Python实现
回归分析是研究变量之间定量关系的一种统计学方法,具有广泛的应用. Logistic回归模型 线性回归 先从线性回归模型开始,线性回归是最基本的回归模型,它使用线性函数描述两个变量之间的关系,将连续或离 ...
- XMLHttpRequest 加载进度
XMLHttpRequest 相关资料请移步这里直接查看,我这里就不在赘述: https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpReque ...
- 没有技术说明文档的开源都是耍流氓:微软Roslyn编译即服务在CIIP中具体应用(上)
前段时间我发布了 github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端,很多园友们都表示支持并与我探讨相关技术问题,上篇中我也承诺会写相关的技术文章,本篇就来介绍一下建模模块中使用 ...