남쪽 우편 OJ 1044 연결 OR 연결 되 지 않 음
시간 제한(일반/자바) :
1000 MS/ 3000 MS 실행 메모리 제한:65536 KByte 총 제출:445 테스트 통과:89
경기 설명
방향 없 는 그림 을 지정 합 니 다.모두 n 개의 점 을 지정 합 니 다.프로그램 을 만들어 두 가지 작업 을 수행 하 십시오.
D x y 원본 그림 에서 x,y 노드 를 연결 하 는 쪽 을 삭제 합 니 다.
Q x y x,y 노드 연결 여부 묻 기
입력
첫 줄 두 개 수 n,m(5<=n<=n<=100000,1<=m<=100000)
다음 m 줄,줄 마다 정수 x y (x,y<=n)는 x,y 사이 에 가장자리 가 연결 되 어 있 음 을 나타 낸다.중복 되 는 끝 이 없 음 을 보증 합 니 다.
다음 줄 의 정수 q(q<=100000)
아래 q 줄 마다 불법 삭제 가 없 도록 합 니 다.
출력
질문 순서에 따라 모든 Q 조작 에 대한 대답,연 결 된 대답 C,연결 되 지 않 은 대답 D 를 출력 합 니 다.
샘플 입력
3 3 1 2 1 3 2 3 5 Q 1 2 D 1 2 Q 1 2 D 3 2 Q 1 2
샘플 출력
C C D
제목 출처
NUAA
/* 307MS
#include<iostream>
#include<map>
#define MAX_N 100001
using namespace std;
int root[MAX_N];
char result[MAX_N];
struct edge{
int a,b;
bool del;
}e[MAX_N],q[MAX_N];
void init(int n){
for(int i=1;i<=n;i++){
root[i] = i;
}
}
int getRoot(int i){
return root[i]==i ? i : root[i]=getRoot(root[i]); //TL
}
void Union(int a, int b){
int ra=getRoot(a),rb=getRoot(b);
if(ra!=rb){
root[ra] = root[rb];
}
}
bool find(int a, int b){
return getRoot(a)==getRoot(b);
}
int main(){
int n,m,i,qNum,outNo;
char cmd[2];
map<int,bool> willDel;
scanf("%d%d",&n,&m);
init(n);
for(i=0;i<m;i++){
scanf("%d%d",&e[i].a,&e[i].b);
if(e[i].a > e[i].b){
e[i].a ^= e[i].b;
e[i].b ^= e[i].a;
e[i].a ^= e[i].b;
}
}
scanf("%d",&qNum);
for(i=0;i<qNum;i++){
scanf("%s%d%d",cmd,&q[i].a,&q[i].b);
if(q[i].a > q[i].b){
q[i].a ^= q[i].b;
q[i].b ^= q[i].a;
q[i].a ^= q[i].b;
}
if('D'==*cmd){
q[i].del = 1;
willDel[ q[i].a*MAX_N+q[i].b ] = 1;
}
}
for(i=0;i<m;i++){ //
if(!willDel[ e[i].a*MAX_N+e[i].b ]){
Union(e[i].a,e[i].b);
}
}
outNo=0;
for(i=qNum-1; i>=0; i--){ // ,
if(q[i].del){
Union(q[i].a,q[i].b);
}else{
if( find(q[i].a,q[i].b) ){
result[outNo++]='C';
}else{
result[outNo++]='D';
}
}
}
for(i=outNo-1;i>=0;i--){
printf("%c
",result[i]);
}
}
*/
/*
// 237MS
#include<iostream>
#include<set>
#define MAX_N 100001
using namespace std;
int root[MAX_N];
char result[MAX_N];
struct edge{
int a,b;
bool del;
}e[MAX_N],q[MAX_N];
void init(int n){
for(int i=1;i<=n;i++){
root[i] = i;
}
}
int getRoot(int i){
return root[i]==i ? i : root[i]=getRoot(root[i]);
}
void Union(int a, int b){
int ra=getRoot(a),rb=getRoot(b);
if(ra!=rb){
root[ra] = root[rb];
}
}
bool find(int a, int b){
return getRoot(a)==getRoot(b);
}
int main(){
int n,m,i,qNum,outNo;
char cmd[2];
set<int> willDel;
scanf("%d%d",&n,&m);
init(n);
for(i=0;i<m;i++){
scanf("%d%d",&e[i].a,&e[i].b);
if(e[i].a > e[i].b){
e[i].a ^= e[i].b;
e[i].b ^= e[i].a;
e[i].a ^= e[i].b;
}
}
scanf("%d",&qNum);
for(i=0;i<qNum;i++){
scanf("%s%d%d",cmd,&q[i].a,&q[i].b);
if(q[i].a > q[i].b){
q[i].a ^= q[i].b;
q[i].b ^= q[i].a;
q[i].a ^= q[i].b;
}
if('D'==*cmd){
q[i].del = 1;
willDel.insert(q[i].a*MAX_N+q[i].b);
}
}
for(i=0;i<m;i++){ //
if(!willDel.count(e[i].a*MAX_N+e[i].b)){
Union(e[i].a,e[i].b);
}
}
outNo=0;
for(i=qNum-1; i>=0; i--){ // ,
if(q[i].del){
Union(q[i].a,q[i].b);
}else{
if( find(q[i].a,q[i].b) ){
result[outNo++]='C';
}else{
result[outNo++]='D';
}
}
}
for(i=outNo-1;i>=0;i--){
printf("%c
",result[i]);
}
}
*/
// 229MS
#include<iostream>
#include<set>
#define MAX_N 100001
using namespace std;
int root[MAX_N];
char result[MAX_N];
struct edge{
int a,b;
bool del;
}e[MAX_N],q[MAX_N];
void init(int n){
for(int i=1;i<=n;i++){
root[i] = i;
}
}
int getRoot(int i){
return root[i]==i ? i : root[i]=getRoot(root[i]);
}
void Union(int a, int b){
int ra=getRoot(a),rb=getRoot(b);
if(ra!=rb){
root[ra] = root[rb];
}
}
bool find(int a, int b){
return getRoot(a)==getRoot(b);
}
int main(){
int n,m,i,qNum,outNo;
char cmd;
set<int> willDel;
scanf("%d%d",&n,&m);
init(n);
for(i=0;i<m;i++){
scanf("%d%d",&e[i].a,&e[i].b);
if(e[i].a > e[i].b){
e[i].a ^= e[i].b;
e[i].b ^= e[i].a;
e[i].a ^= e[i].b;
}
}
scanf("%d",&qNum);
for(i=0;i<qNum;i++){
getchar();
scanf("%c%d%d",&cmd,&q[i].a,&q[i].b);
if(q[i].a > q[i].b){
q[i].a ^= q[i].b;
q[i].b ^= q[i].a;
q[i].a ^= q[i].b;
}
if('D'==cmd){
q[i].del = 1;
willDel.insert(q[i].a*MAX_N+q[i].b);
}
}
for(i=0;i<m;i++){ //
if(!willDel.count(e[i].a*MAX_N+e[i].b)){
Union(e[i].a,e[i].b);
}
}
outNo=0;
for(i=qNum-1; i>=0; i--){ // ,
if(q[i].del){
Union(q[i].a,q[i].b);
}else{
if( find(q[i].a,q[i].b) ){
result[outNo++]='C';
}else{
result[outNo++]='D';
}
}
}
for(i=outNo-1;i>=0;i--){
printf("%c
",result[i]);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ACM - 계산 기하학 적 Pick - up sticks -- poj 2653Description Stan has n sticks of various length. The data for each case start with 1 <= n <= 100000, the number of stick...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.