列表

详情


NC50404. 旅游航道

描述

SGOI旅游局在SG-III星团开设了旅游业务,每天有数以万计的地球人来这里观光,包括联合国秘书长,各国总统和SGOI总局局长等。旅游线路四通八达,每天都有众多的载客太空飞船在星团的星球之间来往穿梭,他们保证了任意两个星球之间总是可以通过航道到达。
但是,最近由于财政出现了困难,一些太空飞船也过于古老,又没有足够的资金购买新产品,所有只好取消一些航道。如果某一条航道的删除使得一些星球不能到达,那么这条航道是不能删除的,称之为「主要航道」。
SGOI旅游局局长希望知道主要航道的数目,但是航道较多,他不能手工计算,于是,他委托你写一个程序,计算主要航道数目。

输入描述

每组数据的首行有两个数m,n。星球的编号从1到m。
以下n行每行用两个整数a,b描述一条航道的信息,表示从星球a到星球b是有航道的。数据由SGOI旅游局提供,你无需担心数据有错。
输入文件以一行00为结束。

输出描述

输出文件共有C行,第i行仅有一个数,表示第i组输入数据的主要行道数目。

示例1

输入:

2 1
1 2
0 0

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 167ms, 内存消耗: 3912K, 提交时间: 2020-05-30 10:12:42

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e4+1;
int m,n;
vector<int> G[MAXN];
int dfn[MAXN];
int low[MAXN];
int clk;
int bridgeCnt;
void init()
{
	for(int i=0;i<MAXN;i++)
	G[i].clear();
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	clk=bridgeCnt=0;
}
void dfs(int s,int f)
{
	dfn[s]=low[s]=++clk;
	for(auto t:G[s])
	if(t!=f)
	{
		if(dfn[t])
		low[s]=min(low[s],dfn[t]);
		else
		{
			dfs(t,s);
			low[s]=min(low[s],low[t]);
			if(low[t]==dfn[t])
			bridgeCnt++;
		}
	}
}
int main()
{
	while(cin>>m>>n&&m&&n)
	{
		init();
		while(n--)
		{
			int a,b;
			cin>>a>>b;
			G[a].push_back(b);
			G[b].push_back(a);
		}
		dfs(1,-1);
		cout<<bridgeCnt<<endl;
	}
}

上一题