zoukankan      html  css  js  c++  java
  • 题解 P2256 【一中校运会之百米跑】

    这道题的思路:map< string , int > + 并查集。

    我们可以很容易想到,把在一个组织里的队员用并查集连接起来,然后统计有几个队伍。

    在这里,我们可以直接统计 (f[x]==x) 的个数。

    由于题目中给出的是字符串,所以我们要用一个 map 映射,直接将字符串转化成整型,相当于给每个人一个编号。

    #include<bits/stdc++.h>
    using namespace std;
    map<string,int> m;//STL大法好
    int f[20005];
    int find(int x) {//并查集——找祖宗
    	if(f[x]!=x) f[x]=find(f[x]);
    	return f[x];
    }
    void merge(string a,string b) {//并查集——合并
    	int x=m[a],y=m[b];
    	x=find(x),y=find(y);
    	if(x!=y) f[x]=y;
    }
    int main() {
    	int n,mm,k;
    	cin>>n>>mm;
    	for(int i=1;i<=n;i++) {
    		string name;
    		cin>>name;
    		m[name]=i;//转换成编号
    		f[i]=i;//并查集初始化
    	}
    	for(int i=1;i<=mm;i++) {
    		string name1,name2;
    		cin>>name1>>name2;
    		merge(name1,name2);
    	}
    	cin>>k;
    	for(int i=1;i<=k;i++) {
    		string name1,name2;
    		cin>>name1>>name2;
    		if(find(m[name1])!=find(m[name2]))//祖宗不同
            		puts("No.");//不在同一组织内
    		else puts("Yes.");
    	}
    	return 0;
    }
    
  • 相关阅读:
    三维几何模板
    凸包
    计算几何 部分模板
    几何模板
    高斯消元模板
    tarjin求割点
    在无向图中找最短桥(tarjan)
    线段树
    错排问题
    NABCD分析
  • 原文地址:https://www.cnblogs.com/ahawzlc/p/12636872.html
Copyright © 2011-2022 走看看