On the mysterious continent of Tamriel, there is a great empire founded by human. To develope the trade, the East Empire Company is set up to transport goods from place to place. Recently, the company wants to start their business in Solstheim, which is consists of N islands. Luckily, there are already M sea routes. All routes are one-way, and the i-th route can transport person and goods from island u to v . Now, the company nominates you a particular job to plan some new routes to make sure that person and goods can be transported between any two islands. Furthermore, because the neighboring regions are under attack by an increasing number of dragons, limited resources can be used to set up new routes. So you should plan to build new routes as few as possible. Input Format The first line contains an integer T, indicating that there are T test cases. For each test case, the first line includes two integers N (N ≤ 10000) and M (M ≤ 100000), as described above. After that there are M lines. Each line contains two integers u and v . Output Format For each test case output one integer, represent the least number of routes required to new.

Sample Input

2

4 3

1 2

2 3

3 4

4 4

1 2

1 4

3 2

3 4

Sample Output

1

2
题意: 加最少的边,使有向图是一个强联通图;
思路: Tarjan算法求出强联通分量之后缩点成一个DAG图,a是DAG图入度为0的点数,b是DAG图出度为0的点数,
因为要为所有入度为0的点加入边,为所有出度为0的点加出边,所以至少要加的边数就是max(a, b);
要注意的是,当整个图原本就是强联通图时(即只有一个强联通分量时),不需要加边;

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack> using namespace std;
const int N = + ; vector<int> edge[N];
stack<int> S; int in[N], out[N], scc[N]; class Trajan{
private:
int dfn[N], low[N];
public:
int dfs_clock, scc_cnt;
void DFS(int u){
dfn[u] = low[u] = ++ dfs_clock;
S.push( u );
for(int i = edge[u].size() - ; i >= ; -- i){
int v = edge[u][i];
if(!dfn[v]){
DFS( v );
if(low[v] < low[u]) low[u] = low[v]; }else if(!scc[v] && dfn[v] < low[u])
low[u] = dfn[v];
}
if(low[u] == dfn[u]){
++ scc_cnt;
while(true){
int v = S.top(); S.pop();
scc[v] = scc_cnt;
if(v == u) break;
}
}
} void Work_scc(int n){
dfs_clock = scc_cnt = ;
for(int i = ; i < N; ++ i)
dfn[i] = low[i] = scc[i] = ; for(int i = ; i <= n; ++ i)
if(!dfn[i]) DFS( i ); }
}Tar; void Solve_question(int n){
for(int i = ; i <= Tar.scc_cnt; ++ i)
in[i] = out[i] = ; for(int i = ; i <= n; i++)
for(int j = edge[i].size() - ; j >= ; -- j)
if(scc[i] != scc[edge[i][j]])
++ out[scc[i]], ++ in[scc[edge[i][j]]]; int in_cnt = , out_cnt = ;
for(int i = ; i <= Tar.scc_cnt; ++i){
if(!in[i]) ++ in_cnt;
if(!out[i]) ++out_cnt;
}
printf("%d\n", Tar.scc_cnt > ? max(in_cnt, out_cnt) : ); //只有一个点时无需加边
} void Input_data(int &n, int &m){
scanf("%d %d", &n, &m);
for(int i = ; i <= n; i++) edge[i].clear();
int u, v;
while(m --){
scanf("%d %d", &u, &v);
edge[u].push_back(v);
}
} int main(){
int T, n, m;
scanf("%d", &T);
while(T --){
Input_data(n, m);
Tar.Work_scc( n );
Solve_question( n );
}
}

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 F. Islands的更多相关文章

  1. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  2. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  4. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  5. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  6. 【2017 ACM/ICPC 乌鲁木齐赛区网络赛环境测试赛 E】蒜头君的排序

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 莫队算法+树状数组. 区间增加1或减少1. 对逆序对的影响是固定的. (用冒泡排序变成升序的交换次数,就是逆序对的个数) [错的次数] 0 [ ...

  7. 2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流

    题目描述: Life is a journey, and the road we travel has twists and turns, which sometimes lead us to une ...

  8. [刷题]ACM/ICPC 2016北京赛站网络赛 第1题 第3题

    第一次玩ACM...有点小紧张小兴奋.这题目好难啊,只是网赛就这么难...只把最简单的两题做出来了. 题目1: 代码: //#define _ACM_ #include<iostream> ...

  9. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

随机推荐

  1. 前端js图片上传

    前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...

  2. R_Studio(时序)Apriori算法寻找频繁项集的方法

    应用ARIMA(1,1,0)对2015年1月1日到2015年2月6日某餐厅的销售数量做为期5天的预测 setwd('D:\\dat') #install.packages("forecast ...

  3. R_Studio(学生成绩)对数值型数据进行统计量分析

    对“Gary.csv”中的成绩数据进行统计量分析 基础数据分析 均值 中位数 极差   标准差   变异系数 1/4分位数 3/4分位数 四分位间距... ...分析 setwd('D:\\data' ...

  4. Android Studio基本使用

    1.    创建Android项目 1)    Application name:应用名称,launcher界面显示的 2)    Company Domain:公司域名(sprd.com) 3)   ...

  5. TL;DR

    英文文章中,偶尔会出现TL;DR 的字符. TL;DR=>Too Long; Don’t Read=>太长了,读不下去=>长话短说 一般用于在文章开头先给出干货.

  6. jQuery .submit()

    .submit() Events > Form Events | Forms .submit( handler )Returns: jQuery Description: Bind an eve ...

  7. Linux搭建Samba共享服务器

    实验要求: Samba文件共享服务配置与访问,配置访问用户以及相应权限. Tips:创建共享目录/test和/share,并且分别在/test下创建文件tf1(只读)tf2(读写)  在/share ...

  8. Android如何使用Https与Nohttp框架使用

    什么是Https? HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...

  9. C++ TODO __fastcall

    C++ TODO __fastcall int __fastcall init_keys2(char *a1, char *a2) { char *v2; // r6 char *v3; // r5 ...

  10. android中常用的注解说明

    1.@Nullable  作用于函数参数或者返回值,标记参数或者返回值可以为空. 2,@NonMull 作用于函数参数或者返回值,标记参数或者返回值不可以为空. 3.@LayoutRes 标记整数值a ...