1063. Set Similarity (25) 并查集

来源:互联网 发布:连通区域图像分割算法 编辑:程序博客网 时间:2024/06/11 11:29

传送门://https://www.patest.cn/contests/pat-a-practise/1063

AC 代码. 不难,典型的并查集考察.

#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;}


0 0