HDOJ 1878 오 라 회 로 (판정 무방 향 투 오 라 회 로 단순 문제)

2104 단어
오 라 회 로
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11481    Accepted Submission(s): 4203
Problem Description
오 라 회 로 는 펜 이 지면 을 떠 나 지 못 하 게 그림 의 각 변 을 한 번 만 그 릴 수 있 고 출발점 으로 돌아 갈 수 있 는 회 로 를 말한다.이제 오 라 회 로 가 있 는 지 그림 을 정 해 주 시 겠 습 니까?
 
Input
테스트 입력 은 약간의 테스트 용례 를 포함한다.각 테스트 용례 의 첫 번 째 줄 은 두 개의 정수 로 노드 수 N (1 < N < 1000) 과 변수 M 을 제시한다.그 다음 에 M 줄 은 M 개의 변 에 대응 하고 각 줄 은 한 쌍 의 정 수 를 제시 하 는데 각각 이 변 이 직접 연 결 된 두 노드 의 번호 (노드 는 1 에서 N 번호) 이다.N 이 0 일 때 입력 이 끝 납 니 다.
 
Output
모든 테스트 용례 의 출력 은 한 줄 을 차지 하고, 오로라 회로 가 존재 하면 1 을 출력 하고, 그렇지 않 으 면 0 을 출력 한다.
 
Sample Input

   
   
   
   
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0

 
Sample Output

   
   
   
   
1 0

 
문제 풀이: 투 오 라 회 로 를 판정 하고 조건: ① 그림 연결, ② 모든 점 도 수 는 2 이다.
코드 는 다음 과 같 습 니 다:
#include<cstdio>
#include<cstring>
#define maxn 1010
int tree[maxn],degree[maxn];
 
int find(int x)
{
	if(x==tree[x])
		return x;
	return tree[x]=find(tree[x]);
}

void merge(int a,int b)
{
	int fa=find(a);
	int fb=find(b);
	if(fa!=fb)
		tree[fa]=fb;
}

int main()
{
	int n,m,u,v,i,cnt;
	while(scanf("%d",&n)&&n)
	{
		for(i=1;i<=n;++i)
			tree[i]=i;
		scanf("%d",&m);
		memset(degree,0,sizeof(degree));
		while(m--)
		{
			scanf("%d%d",&u,&v);
			degree[u]++;
			degree[v]++;
			merge(u,v);
		}
		cnt=0;
		for(i=1;i<=n;++i)
		{
			if(find(i)==i)
				cnt++;
		}
		if(cnt>1)
			printf("0
"); else { cnt=0; for(i=1;i<=n;++i) { if(degree[i]%2) { cnt=1; break; } } if(cnt) printf("0
"); else printf("1
"); } } return 0; }

좋은 웹페이지 즐겨찾기