离散数学 之 用C++实现对称闭包
在这里插入代码
#include<bits/stdc++.h>
using namespace std;
//定义有序对
struct Pair {
int x;
int y;
Pair(int ix, int iy) {
x = ix;
y = iy;
}
void print() const{
cout << "<" << x << "," << y << ">";
}
};
//定义关系的排序
typedef struct {
bool operator ()(const Pair p1, const Pair p2) const{
if(p1.x!=p2.x) return p1.x<p2.x;
return p1.y<p2.y;
}
}compare;
int main() {
int n;
int case_no = 1;
while (cin >> n) {
int m;
cin >> m;
int j,k,i;
set<Pair, compare> R;
for(i=0;i<m;++i){
scanf("%d%d",&j,&k);
R.insert(Pair(j,k));
R.insert(Pair(k,j));
}
cout << "case " << case_no++ << ":" << endl;
for(set<Pair, compare>::iterator it=R.begin();it!=R.end();++it){
it->print();
printf("\n");
}
}
return 0;
}
要点
鉴于这个比较简单,就不详细说了
定义新的 数据类型 并 重载排序 关系
struct Pair {//定义 有序对
int x;
int y;
Pair(int ix, int iy) {
x = ix;
y = iy;
}
void print() const{//定义输出方式
cout << "<" << x << "," << y << ">";
}
};
//定义关系的排序
typedef struct {//运用重载定义集合 set 中的有序对排列按照字典顺序
bool operator() (const Pair p1, const Pair p2) const{
if(p1.x!=p2.x) return p1.x<p2.x;
return p1.y<p2.y;
}//函数重载定义
}compare;
其次只需要将给出的 关系 与 关系的逆 进行并运算
for(i=0;i<m;++i){
scanf("%d%d",&j,&k);
R.insert(Pair(j,k));
R.insert(Pair(k,j));//<j,k>的逆就是 <k,j>
}//两者同时 插入 集合R中 来
最后 一个 迭代 输出 即可
for(set<Pair, compare>::iterator it=R.begin();it!=R.end();++it){
it->print();
printf("\n");
}
wish you all the best.