제목 설명
문제 설명
항일 전쟁, 터널 전쟁의 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를 ) / ~