2019.6.7HDOJ-1232畅通工程,查并集

哇,今天的CF六一欢乐场我没去诶,队友都去了。
看来没打过CF的就我一个了,好自闭。

HDOJ-1232题目

Problem-1232畅通工程

AC的代码

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int city[1005];
int findpar(int a);
int join(int a,int b);
int main()
{
	int n,m,uni;
	while(cin>>n>>m&&n){
		uni=n;//集团个数
		int i,city1,city2;
		for(i=1;i<=n;i++)
			city[i]=i;
		for(i=0;i<m;i++){//m条道路
			cin>>city1>>city2;
			if(findpar(city1)!=findpar(city2)){
				join(city1,city2);
				uni--;//每两个集团合并,uni-1
			}
		}
		cout<<uni-1<<endl;
	}
	return 0;
}
int findpar(int a)//找a的boss
{
	int r=city[a];//与a联通的城市
	while(city[r]!=r){
		r=city[r];
	}
	int temp;
	while(a!=r){
		temp=city[a];//a的上级
		city[a]=r;
		a=temp;
	}
	return r;
}
int join(int a,int b)
{
	int flag=0;
	int M=findpar(a),N=findpar(b);
	if(M!=N){
		flag=1;
		city[M]=N;
	}
	return flag;
}

写了一道查并集,查并集是一个半月之前学的,有点不熟……

HDOJ-1231题目

Problem-1231 How Many Tables

AC的代码

#include<stdio.h>
#include<string.h>
int head[1005];
int find(int x);
void join(int x,int y);
int main(void)
{
	int i,j;
	int t,n,m;
	scanf("%d",&t);
	while(t-->0){
		scanf("%d %d",&n,&m);
		memset(head,0,sizeof(int));
		for(i=1;i<=n;i++)
			head[i]=i;
		int x1,x2,count=0;
		while(m-->0){
			scanf("%d %d",&x1,&x2);
			if(find(x1)!=find(x2))
				join(x1,x2);
		}
		for(i=1;i<=n;i++){
			if(i==head[i])
				count++;
		}
		printf("%d\n",count);
	}
	return 0;
}
int find(int x)
{
	int i=x,temp;
	while(x!=head[x])
		x=head[x];
	while(i!=x){
		temp=i;
		i=head[i];
		head[temp]=x;
	}
	return x;
}
void join(int x,int y)
{
	int boss1=find(x);
	int boss2=find(y);
	if(boss1!=boss2){
		head[boss2]=boss1;
	}
	return;
}

这是当初学查并集时写的练习题。

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
294010042019-06-07 22:32:33Accepted1232109MS1808K813 BC++Overstars
290303492019-04-23 12:38:48Accepted12130MS1700K761 BCOverstars
290289302019-04-23 07:31:28Wrong Answer121315MS1692K759 BCOverstars
290289272019-04-23 07:27:07Wrong Answer121315MS1700K731 BCOverstars

2019年6月7日23点02分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值