您的位置:首页 > 其它

1063. Set Similarity (25) 并查集

2016-03-09 13:50 302 查看
传送门://https://www.patest.cn/contests/pat-a-practise/1063AC 代码. 不难,典型的并查集考察.#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>
#include <set>
#include <cmath>
#include <map>
using namespace std;
int main(){
int n,k,t,m,query1,query2;
scanf("%d",&n);
vector<set<int>> ans;
for (int i=0; i<n; ++i) {
scanf("%d",&k);
set<int> s;
for (int j=0; j<k; ++j) {
scanf("%d",&t);
s.insert(t);
}
ans.push_back(s);
}
scanf("%d",&m);
for (int i=0; i<m; ++i) {
scanf("%d %d",&query1,&query2);
query1--;
query2--;
vector<int> diff(ans[query1].size()+ans[query2].size());
vector<int> unio(ans[query1].size()+ans[query2].size());
auto it = set_intersection(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), diff.begin());
diff.resize(it-diff.begin());
it = set_union(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), unio.begin());
unio.resize(it-unio.begin());
int len1 = (int)diff.size(),len2 =(int)unio.size();
double r = len1*100.0/(len2*1.0);
printf("%.1lf%%\n",r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: