描述
给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。
输入描述:
每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000。
输出描述:
每行输出最简真分数组合的个数。
示例1
输入:
7 3 5 7 9 11 13 15 3 2 4 5 0
输出:
17 2
解题思路:
(1)利用构建最小生成树的思路思考;
(2)如果可以构建,则可连通,反之不可;
代码:
#include <iostream>
using namespace std;
struct Edge{
int from;
int to;
};
Edge edge[50000];
int father[1000];
void init(int n){ //初始化根结点
for(int i=1;i<=n;i++){
father[i]=i;
}
}
int find(int x){ //找根结点
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y){ //合并
x=find(x);
y=find(y);
if(x!=y){
father[x]=y;
}
}
int main() {
int n,m;
while (cin >> n >>m ) {
if(n==0 && m==0) break;
int sum=0;
init(n);
for(int i=0;i<m;i++){
cin>>edge[i].from>>edge[i].to;
}
for(int i=0;i<m;i++){
int x=edge[i].from;
int y=edge[i].to;
if(find(x)!=find(y)){
Union(x,y);
sum++;
}
}
if(sum==n-1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}