NC23979. 点对
描述
输入描述
第一行两个正整数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; }