哇,今天的CF六一欢乐场我没去诶,队友都去了。
看来没打过CF的就我一个了,好自闭。
HDOJ-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题目
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 ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
---|---|---|---|---|---|---|---|---|
29401004 | 2019-06-07 22:32:33 | Accepted | 1232 | 109MS | 1808K | 813 B | C++ | Overstars |
29030349 | 2019-04-23 12:38:48 | Accepted | 1213 | 0MS | 1700K | 761 B | C | Overstars |
29028930 | 2019-04-23 07:31:28 | Wrong Answer | 1213 | 15MS | 1692K | 759 B | C | Overstars |
29028927 | 2019-04-23 07:27:07 | Wrong Answer | 1213 | 15MS | 1700K | 731 B | C | Overstars |
2019年6月7日23点02分