列表

详情


NC216126. 卡牌收集

描述

小A收集了n张卡牌,每张卡牌都可能有指定的组合。
如果a和b可以组合,b和c也可以组合那么abc就是一个组合。
小A给每张卡牌进行了编号,他知道哪两张卡牌可以配对,共m对配对信息,因为小A这些信息存了很长时间,所以可能有重复的。
但是卡牌太多了请你帮他算一算 卡牌1在多少张卡牌组成的组合里面?

输入描述

1<=n<=2000000
0<=m<=1000000
1<=a<=2000000
1<=b<=2000000
输入为m+1行
第一行两个整数为n m
以下m行为a b

输出描述

输出一个整数 卡牌1在多少张卡牌组成的组合里面

示例1

输入:

10 5
1 2
3 4
5 6
2 3
2 6

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 1700ms, 内存消耗: 55312K, 提交时间: 2021-11-07 19:16:45

def getint():
    return [int(i) for i in input().split()]
n,m=getint()
a=[0]*(n+1)
for i in range(1,n+1):
    a[i]=i
def find(x):
    if a[x]==x:
        return x
    else:
        a[x]=find(a[x])
        return a[x]
def union(x,y):
    a[find(x)]=find(y)
for i in range(m):
    x,y=getint()
    union(x,y)
#print(a)
x=find(1)
#print("x:",x)
ans=0
for i in range(1,n+1):
    if find(a[i])==x:
        ans+=1
        #print(i)
print(ans)

C++(clang++11) 解法, 执行用时: 448ms, 内存消耗: 8220K, 提交时间: 2021-04-05 16:14:23

#include <bits/stdc++.h>
using namespace std;
int n,m,p,a,b,f[2000001],i,t=1;
int find(int x)
{	
    if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
int main()
{
	cin>>n>>m;
	for(i=1;i<=n;i++)
		f[i]=i;
	for(i=1;i<=m;i++)
	{
        cin>>a>>b;
		f[find(a)]=find(b);	
	} 
	for(i=2;i<=n;i++)
		if(find(1)==find(i))
			t++;
	cout<<t;			
	return 0;	
}

上一题