列表

详情


NC23979. 点对

描述

NM(u,v)(u<v)uvvu

输入描述

第一行两个正整数N,M,表示点数与边数。接下来M行,第i行两个正整数ui,vi,表示一条从ui到vi的边,保证ui≠vi。

输出描述

一行一个整数,表示点对数量。

示例1

输入:

3 3
1 2
2 3
3 2

输出:

1

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 97ms, 内存消耗: 1932K, 提交时间: 2020-08-06 14:43:22

#include<iostream>
using namespace std;
int a[1000][1000];
int u,v,n,m,cnt=0,x,y;
int main() {
	cin>>n>>m;
	for(int i=0; i<m; i++) cin>>x>>y,a[x][y]=1;
	for(int i=1; i<=n; i++)//florid算法? 
		for(int j=1; j<=n; j++)
			for(int k=1; k<=n; k++)
				if(a[i][j]&&a[j][k])  a[i][k]=1;
	for(int i=1; i<=n; i++)
		for(int j=i+1; j<=n; j++)
			if(a[i][j]&&a[j][i]) cnt++;
	cout<<cnt;
}

C(clang 3.9) 解法, 执行用时: 19ms, 内存消耗: 732K, 提交时间: 2019-06-23 14:27:57

#include<stdio.h>
int a[400];
int find(int x){
	return a[x]==x?x:(a[x]=find(a[x]));
}
int main()
{
	int i,j,n,t,x,y,m,f,c=0;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)	
		a[i]=i;
	while(m--){
		scanf("%d %d",&x,&y);
		x=find(x);
		y=find(y);
		if(x!=y) a[x]=y;
	}
	for(i=1;i<n;i++)
		for(j=i+1;j<=n;j++)  
			if(a[i]==a[j]) c++;
		
	printf("%d",c);
	return 0;
}

上一题