试题编号: | 201509-4 |
试题名称: | 高速公路 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。 现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对。 国王想知道,在大臣们给他的计划中,有多少个便利城市对。输入格式 输入的第一行包含两个整数n, m,分别表示城市和单向高速公路的数量。 接下来m行,每行两个整数a, b,表示城市a有一条单向的高速公路连向城市b。输出格式 输出一行,包含一个整数,表示便利城市对的数量。样例输入5 51 22 33 44 23 5样例输出3样例说明 |
解题代码(java):
import java.util.Scanner;import java.util.Vector;import java.lang.Math;public class Main { @SupPRessWarnings("unchecked") public static Vector<Integer> []g = new Vector[10005]; @SuppressWarnings("unchecked") public static Vector<Integer> component[] = new Vector[10005]; public static int []STACK = new int[10005]; static int TOP=0; static boolean [] instack = new boolean[10005]; static int []dfn = new int[10005]; static int []low = new int[10005]; static int index=1; static int cnt=0; public static void main(String[] args) { int n =0,m=0,x=0,y=0; int ans=0; Scanner in = new Scanner(System.in); n = in.nextInt(); m = in.nextInt(); for(int i = 0;i<n+1;i++){ g[i] = new Vector<Integer>(); } for(int i = 0;i<5000;i++) { component[i] = new Vector<Integer>(); } for(int i = 0;i<m;i++){ x= in.nextInt(); y=in.nextInt(); g[x].add(y); } in.close(); for(int i=1;i<=n;i++){ if(dfn[i]==0) tarjan(i); } for(int i=1;i<=cnt;i++){ Vector<Integer> vec=component[i]; int sz=vec.size(); if(sz==1) continue; else ans+=sz*(sz-1)/2; System.out.println(ans); } } static void tarjan(int x){ dfn[x]=low[x]=index++; instack[x]=true; STACK[++TOP]=x; int j; for(int i=0;i<g[x].size();i++){ j=g[x].get(i); if(dfn[j]==0){ tarjan(j); low[x]=Math.min(low[x],low[j]); } else if(instack[j]){ low[x]=Math.min(low[x],dfn[j]); } } if(dfn[x]==low[x]){ cnt++; do{ j=STACK[TOP--]; instack[j]=false; component[cnt].add(j); }while(x!=j); } }} 得分70分
新闻热点
疑难解答