[블루 브릿지 컵] [2013 네 번째 Zhenti] 위험 인자 (폭력 + DFS)

제목 설명
문제 설명
항일 전쟁, 터널 전쟁의 Jizhong 평야가 중요한 역할을하고있다.
채널에 여러 사이트 중에서 정통 큰 네트워크를 형성하기 위해 연결되어 있습니다. 적의 따라서 손실 접촉 할 수있는 다른 사이트들 사이에서 사이트를 찾을 때 위험이있다.
: 우리는 위험 인자 DF (X, Y)를 정의
하면 사이트 Z를 찾을 수 있다면, Z는 때 적, X 파괴와 y는 우리 말, 아무도없는, 두 사이트 x와 y (X = Y!)의 경우 Z는 X의 핵심이며, Y가. 따라서, 어떤 위치의 쌍 X 및 Y는, 위험 요소 DF (X, Y)는 두 지점에서 키 포인트의 개수를 나타낸다 사이이다.
이 질문의 임무는 다음 두 사이트 사이에 위험 계수를 추구, 네트워크 구조를 감안할 때.
입력
제 1 라인의 입력 데이터는 두 정수 N 포함 (2 <= N <= 1,000) m (0 <= m <= 2000), 사이트의 수, 채널들의 수를 나타내는,
두 개의 정수의 다음의 m 라인 U, V (1 <= U , V <= N, U = V!) 채널을 나타내는,
마지막 행, U 개의 숫자, V, 심문 위험 인자 DF 대표 (U, V), 두 지점 사이.
출력
정수 쿼리 통신 아닌 경우 두 개의 출력 -1.
샘플 입력
. 7.6
. 3 1
2 3
. 4 (3)
. 3.5
. 4. 5
. 5.6
. 1.6
의 출력 예
2
아이디어 : 두 점 사이의 절단 지점 찾기, emmmm는 절단 지점을 찾고 그래프를 생각하기 시작하지만, 어떤 문제가 많이되지 보인다. 1000 데이터의 양, 우리는 모든 지점 컷 지점을 설정하면 유에서 V에 올 수 있는지 확인합니다. 이러한 복잡도는 O (N ^ 2)는 타임 아웃 시간이 없다. 모든 경로가 깊은 온라인으로 돌아가서 U-에 대한보고 검색 +> 시간 복잡도와 V의 족장에 대해해야합니다.
다음과 같이 코드입니다 :

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=2e3+100;
struct edge{
	int to,next;
}e[maxx<<1];
int head[maxx<<1],vis[maxx];
int n,m,tot;
int u,v;

inline void init()
{
	memset(head,-1,sizeof(head));
	tot=0;
}

inline void add(int u,int v)
{
	e[tot].next=head[u],e[tot].to=v,head[u]=tot++;
}
inline void dfs(int u)
{
	vis[u]=1;
	if(u==v) return ;//一个小小的剪枝
	for(int i=head[u];i!=-1;i=e[i].next)
	{
		int to=e[i].to;
		if(vis[to]) continue;
		dfs(to);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	init();
	int x,y;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	scanf("%d%d",&u,&v);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(i==u||i==v) continue;
		for(int j=1;j<=n;j++) vis[j]=0;
		vis[i]=1;
		dfs(u);
		if(vis[v]==0) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

아, (연료를 보급하려면 O를 ) / ~

게시 된 598 개 원래 기사 · 원 찬양 49 ·은 40000 +를 볼

추천

출처blog.csdn.net/starlet_kiss/article/details/105219331