UVA12167 Proving Equivalences
UVA12167 Proving Equivalences
题意翻译
题目描述 在数学中,我们常常需要完成若干命题的等价性证明。
例如:有4个命题a,b,c,d,要证明他们是等价的,我们需要证明a<=>b,然后b<=>c,最后c<=>d。注意每次证明是双向的,因此一共完成了6次推导。另一种证明方法是:证明a->b,然后b->c,接着c->d,最后d->a,只须4次证明。
现在你任务是证明 n 个命题全部等价,且你的朋友已经为你作出了m次推导(已知每次推导的内容),你至少还需做几次推导才能完成整个证明。
输入数据 有T(T<=100)组数据,每组数据第一行为两个整数n和m(1<=n<=20000, 1<=m<=50000),即命题数和已完成的推导个数(编号为1..n)。以下m行每行包含两个整数s1和s2(1<=s1,s2<=n,s1!=s2),表明已经证明了s1->s2。
输出数据 输出还需要做推导数的最小值。
感谢@hicc0305 提供的翻译
错误日志: 没有特判 \(numc = 1\) (即任意两点互通)时答案为 \(0\) 的情况
Solution
强联通分量搞成 \(DAG\) , 因为需要加边把图变为一个大强联通分量, 考虑出度和入度为 \(0\) 的点的数量, 这些点无法被到达或无法到达其他点, 输出计数的较大值即可满足所有点互达
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define cln(s, v) memset(s, v, sizeof(s))
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 1000019,INF = 1e9 + 19;
int head[maxn],nume = 1;
struct Node{
int v,dis,nxt;
}E[maxn << 3];
void add(int u,int v,int dis){
E[++nume].nxt = head[u];
E[nume].v = v;
E[nume].dis = dis;
head[u] = nume;
}
int DFN[maxn], LOW[maxn], INDEX;
int numc, col[maxn];
bool ins[maxn];
int S[maxn], top;
void Tarjan(int u){
DFN[u] = LOW[u] = ++INDEX;
S[++top] = u;ins[u] = 1;
for(int i = head[u];i;i = E[i].nxt){
int v = E[i].v;
if(!DFN[v])Tarjan(v), LOW[u] = min(LOW[u], LOW[v]);
else if(ins[v])LOW[u] = min(LOW[u], DFN[v]);
}
if(DFN[u] == LOW[u]){
numc++;
while(S[top + 1] != u){
col[S[top]] = numc;
ins[S[top--]] = 0;
}
}
}
int ing[maxn], outg[maxn];
void init(){
cln(head, 0), nume = 1;
INDEX = 0, cln(DFN, 0), cln(LOW, 0);
cln(col, 0), numc = 0;
cln(ing, 0), cln(outg, 0);
}
int T, num, nr;
int main(){
T = RD();
while(T--){
init();
num = RD();nr = RD();
for(int i = 1;i <= nr;i++){
int u = RD(), v = RD();
add(u, v, 0);
}
for(int i = 1;i <= num;i++)if(!DFN[i])Tarjan(i);
if(numc == 1){printf("0\n");continue;}
for(int u = 1;u <= num;u++){
for(int i = head[u];i;i = E[i].nxt){
int v = E[i].v;
if(col[u] != col[v]){
ing[col[v]]++;
outg[col[u]]++;
}
}
}
int in = 0, out = 0;
for(int i = 1;i <= numc;i++){
if(ing[i] == 0)in++;
if(outg[i] == 0)out++;
}
printf("%d\n", max(in, out));
}
return 0;
}
UVA12167 Proving Equivalences的更多相关文章
- hdu 2767 Proving Equivalences
Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...
- hdoj 2767 Proving Equivalences【求scc&&缩点】【求最少添加多少条边使这个图成为一个scc】
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Proving Equivalences(加多少边使其强联通)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- UVALive - 4287 - Proving Equivalences(强连通分量)
Problem UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Outp ...
- HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
- HDU 2767 Proving Equivalences (强联通)
pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...
- Proving Equivalences (hdu 2767 强联通缩点)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU2767 Proving Equivalences(加边变为强联通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
随机推荐
- 修改MyEclipse工作空间
MyEclipse如何更改工作空间,MyEclipse是java开发常用工具,在开发的过程中我们会经常切换工作空间来切换项目内容,初学者来说有必要讲一下如何切换工作空间 工具/原料 MyEclip ...
- Maven3 用Maven创建第一个web项目(2)servlet演示
上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...
- Visual Studio发展历程初浅调研
名称 内部版本 发布日期 支持.NET Framework版本 核心功能 竞争对手 优缺点 Visual C++ 1.0 Visual Studio的最初原型 1992 把软件开发带入了可视化开发的时 ...
- SDWebImage缓存图片的机制
SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...
- CANOpen学习指南
对于初学者,相对于其他总线的资料来说,在国内CANOpen的资料并不多.而且并不是所有资料都适合初学者看的.这里给出一些建议,对CANOpen感兴趣的,可以参考一下学习的顺序. 前提:需要对CAN总线 ...
- js作用域相关笔记
1.js引擎.编译器.作用域. 引擎:负责JS全过程的编译和执行: 编译器:负责语法分析和代码生成: 作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于 ...
- beta阶段成果展示博客
跟着我们一一点一点揭开蒙娜丽莎的微笑 - 本次beta阶段之前,我们团队,对其他组在事后诸葛亮期间对我们的评价进行深刻的审视,特别是缺点方面,开了好几次的站立会议,专门讨论beta的主要方向和任务.最 ...
- [转贴] IPSEC From 知乎
作者:埃文科技链接:https://zhuanlan.zhihu.com/p/44874772来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 认识IPSec IPSec ...
- vue使用axios发送数据请求
本文章是基于vue-cli脚手架下开发 1.安装 npm install axios --s npm install vue-axios --s 2.使用.在index.js中(渲染App组件的那个j ...
- SpringBoot(四)_Spring Data JPA的使用
JPA 绝对是简化数据库操作的一大利器. 概念 首先了解 JPA 是什么? JPA(Java Persistence API)是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供 ...