CCF CSP 高速公路 JAVA 201509-4 100分


题目放下面了

两种解法:

1.tarjan算法  专门用来求这种强连通分量,可以解到N<10000,M<100000的数据(1S内)

2.禁忌的解法=。= (感觉和Kosaraju有点像?) 但只能解到N<1000,M<10000的数据(效率差了10倍不止),但优点在于理解简单,容易操作


先说第一种解法:

tarjan算法介绍:https://wenku.baidu.com/view/112c64096c85ec3a87c2c527.html?re=view

——如果看不懂可以看进一步解释:http://www.cnblogs.com/dqsBK/p/5350257.html

——再看不懂就来看看实际运作过程:http://blog.csdn.net/mystery_guest/article/details/51912713

相信到这里一定已经懂了

引用:

dfn数组: 意思就是在dfs的过程中,当前的这个节点是第几个被访问的

low数组: 有些并查集的意思,就是在dfs的过程中,标记如果当前节点是极大强联通子图的话,他的根节点的标号就是对应的low值:

      如果下一个要遍历的节点在栈中,那么就要把当前节点的low值设置成 下一个节点(在栈中)的dfn值,dfn值是什么呢?就是记录这个节点是第几个被遍历到的。

      如果下一个要遍历的节点不再栈中,那么就要把当前节点的low值设置成下一个节点和当前节点的low值中最小的那个。


看懂了过程,只要自己心里多模拟几遍,差不多就掌握这个算法啦:

实际代码:(JAVA版)——JAVA比C++慢一点,C++100分,JAVA同样是90分,不公平TOT

package csp2015_09_4;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main{
	static List<Integer> list[];
	static boolean visited[];
	static int DFN[];
	static int LOW[];
	static Stack<Integer> s ;
	static int index;
	static int ans = 0;
	
	public static void main(String [] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		list = new ArrayList[n+1];
		for (int i = 0; i <= n; i++) {
			list[i] = new ArrayList<Integer>();
		}
		int a,b;
		for (int i = 0; i < m; i++) {
			a = sc.nextInt();
			b = sc.nextInt();
			list[a].add(b);
		}
		
		s = new Stack<Integer>();
		visited = new boolean[n+1];
		DFN = new int[n+1];
		LOW =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值