求割点

本文深入探讨了Java中算法与数据结构的应用实例,通过具体代码解析,展示如何高效解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.bluecup.org;

import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;



public class CutPoint {

	/**
	 * @param args
	 */
	static int n;
	static TreeSet<Integer>[] sets = new TreeSet[20];
	static boolean used[] = new boolean[20];
	static int low[] = new int[20];
	static int dfn[] = new int[20];

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		for (int i = 1; i <= n; i++) {
			sets[i] = new TreeSet<Integer>();
		}
		int i;
		do {
			i = scan.nextInt();
			int j = scan.nextInt();
			if (i > 0) {
				sets[i].add(j);
				sets[j].add(i);
			}
		} while (i != 0);
		dfn(1);
		int value=0;
		for(int ii=1;ii<=n;ii++)
		{
			if(flag[ii]==1)
			{
				value++;
				System.out.println(ii);
			}
		}
	}

	static int times;

	static int flag[]=new int[20];
	private static void dfn(int v) {
		// TODO Auto-generated method stub
		times++;
		dfn[v] = low[v] = times;
		int count=0;
		//System.out.println(sets[v].size());
		used[v] = true;
		int size = sets[v].size();
		Iterator<Integer> it=sets[v].iterator();
		for (int i = 0; i < size; i++) {
			int w = it.next();
			if (used[w] == false) {
				count++;
				dfn(w);
				low[v]=Math.min(low[v],low[w]);
				if(v==1&&count>=2)
				{
					flag[v]=1;
				}
				if(v!=1&&low[w]>=dfn[v])
					flag[v]=1;
			}
			else if(w!=v)
			{
				low[v]=Math.min(low[v], dfn[w]);
			}
		}
		
	}

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值