CCF试题:高速公路(Targin)
现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对。
国王想知道,在大臣们给他的计划中,有多少个便利城市对。
接下来m行,每行两个整数a, b,表示城市a有一条单向的高速公路连向城市b。
1 2
2 3
3 4
4 2
3 5
城市间的连接如图所示。有3个便利城市对,它们分别是(2, 3), (2, 4), (3, 4),请注意(2, 3)和(3, 2)看成同一个便利城市对。
前60%的评测用例满足1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000;
所有评测用例满足1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000。
- import java.util.Scanner;
- public class Main {
- static class Edge { // 邻接表
- int v;
- int next;
- }
- static int[] first;// first[]头结点数组
- static int tot;
- static int n, m; // 节点数,边数
- static Edge[] edge; // 边
- static int []Stack;
- static int top;
- static boolean[] inStack;
- static int[] DFN; // DFN[]为深搜次序数组(标记时间)
- static int[] low; // Low[u]为u结点或者u的子树结点所能追溯到的最早栈中结点的次序号
- static int Count, cnt; // Count记录强连通分量
- static int[] Belong;// Belong[]为每个结点所对应的强连通分量标号数组
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- n = sc.nextInt();
- m = sc.nextInt();
- tot = 0;
- Count = 0;
- cnt = 0;
- Stack = new int[n+1];
- top=0;
- edge = new Edge[m + 1];
- first = new int[n + 1];
- for (int i = 1; i <= n; i++) {
- first[i] = -1;
- }
- Belong = new int[n + 1];
- DFN = new int[n + 1];
- low = new int[n + 1];
- inStack = new boolean[n + 1];
- int u, v;
- for (int i = 0; i < m; i++) {
- u = sc.nextInt();
- v = sc.nextInt();
- addEdge(u, v);
- }
- cnt = 0;
- int[] hash = new int[n + 1];
- for (int i = 1; i <= n; i++) {
- if (DFN[i] == 0) {
- Targin(i);
- }
- }
- for (int i = 1; i <= n; i++) {
- hash[Belong[i]]++;
- }
- int sum = 0;
- for (int i = 1; i <= Count; i++) {
- if (hash[i] != 1) {
- sum = sum + hash[i] * (hash[i] - 1) / 2; // 除以2的原因是2-3 和 3-2是一条
- }
- }
- System.out.println(sum);
- }
- private static void Targin(int u) {
- DFN[u] = low[u] = ++cnt;
- inStack[u] = true;
- Stack[top++]=u;
- // 枚举边
- for (int e = first[u]; e != -1; e = edge[e].next) {
- int v = edge[e].v;
- if (DFN[v] == 0) { // j没被访问过
- Targin(v);
- // 更新结点u所能到达的最小次数层
- if (low[u] > low[v])
- low[u] = low[v];
- } else if (inStack[v] && low[u] > DFN[v]) {// 如果v结点在栈内
- low[u] = DFN[v];
- }
- }
- if (DFN[u] == low[u]) {
- // 如果节点u是强连通分量的根
- Count++;
- int v;
- do {
- v = Stack[--top];
- Belong[v] = Count;
- inStack[v] = false;
- } while (u != v);
- }
- }
- private static void addEdge(int u, int v) { // 构建邻接表
- edge[tot] = new Edge();
- edge[tot].v = v;
- edge[tot].next = first[u];
- first[u] = tot++;
- }
- }
CCF试题:高速公路(Targin)的更多相关文章
- 节日(CCF试题)
试题编号: 201503-3试题名称: 节日时间限制: 1.0s内存限制: 256.0MB问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比 ...
- 【CCF】高速公路 tarjan强连通缩点
[题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...
- CCF 试题编号: 201909-4 试题名称: 推荐系统
这题是stl的综合应用,map要想快,直接上unordered_map,这样查询接近O(1),是不是很嗨皮. 思路其实还是很简单的,type+id做个Hash,由于set.insert的第一个返回值是 ...
- CCF认证历年试题
CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...
- 强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧
xdoj 1025 亮亮最近在玩一款叫做“梦想庄园”的经营游戏.在游戏中,你可以耕种,养羊甚至建造纺织厂. 如果你需要制造衣服,你首先得有布匹和毛线.布匹由棉花纺织而成:毛线由羊毛制成,而羊需要饲料才 ...
- CCF CSP 201509-4 高速公路
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-4 高速公路 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在 ...
- CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案
前几天知道的CCF计算机职业资格认证考试,觉得好像比软考含金量高一些,就去了解了一下,做了模拟试题中的 “出现次数最多的数” 这道题,我的算法和官方答案算法不同,个人觉得觉得官方的好一点,没那么繁琐, ...
- CCF计算机软件能力认证试题练习:201912-5 魔数
CCF计算机软件能力认证试题练习:201912-5 魔数 前置知识:BFS,线段树等 \(f(x) = (x\%A)\%B\) 这个函数值的和直接用线段树维护是不太行的(也可能是我不知道),后来想了很 ...
- CCF CSP认证考试试题
1. 201803-1 跳一跳 试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的 ...
随机推荐
- poj3177 BZOJ1718 Redundant Paths
Description: 有F个牧场,1<=F<=5000,现在一个牧群经常需要从一个牧场迁移到另一个牧场.奶牛们已经厌烦老是走同一条路,所以有必要再新修几条路,这样它们从一个牧场迁移到另 ...
- 【状压DP】【UVA11795】 Mega Man's Mission
传送门 Description 你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪.游戏初始你有一把武器,能杀死一些怪物.每次只能杀一只,求有多少种杀怪方法. Input 多组数 ...
- Hive架构及应用介绍【链接】
原文链接:https://blog.csdn.net/a2011480169/article/details/51482799
- OopenCV复习及函数深入理解(轮廓查询及绘图)
核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...
- Leetcode 445. 两数相加 II
1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...
- array_pop 剔除最后一个数组元素
<?php $a=array("red","green","blue"); print_r(array_pop($a)); //blu ...
- [LeetCode] 16. 3Sum Closest ☆☆☆
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- svn全备加强版
svn版本库备份 官方建议使用如下方法备份(全备) svnadmin hotcopy path/to/repository path/to/backup 链接:https://tortoisesvn. ...
- Centos下Mysql密码忘记解决办法
1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...
- iOS开发者两分钟学会用GitHub在Mac上托管代码的两种方法
原文发布者:http://blog.csdn.net/duxinfeng2010 在Mac上使用Xcode进行iOS-Apple苹果iPhone手机开发过程中少不了使用GitHub在Mac上托 ...