UVALive 3644 X-Plosives

本篇是刘汝佳《算法竞赛入门经典——训练指南》的读书笔记。

知识点:  并查集

解题思路:

  将每种元素看成一个点,而每种化合物看成是由两种元素(即两个点组成的一条边),以此建图。如果加入某一条边后会出现环(即(k)条边(化合物),(k)个点(元素)),那么我们就不将这条边加入图中,即(ans+1).

  用并查集来维护这个图,如果一条边的两个点本来就相连(即其根节点相同),那么就说明加入这条边后会出现环。

AC代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 const int maxn = 1e5+10;
 5 
 6 int par[maxn];
 7 void init(){
 8     for(int i=0;i<maxn;i++)
 9         par[i]=i;
10 }
11 int finds(int x){
12     if(par[x]==x)   return x;
13     return par[x]=finds(par[x]);
14 }
15 int main(){
16     int a,b;
17     int ans=0;
18     init();
19     while(scanf("%d",&a)==1){
20         if(a==-1){
21             printf("%d
",ans);
22             ans=0;
23             init();
24             continue;
25         }
26         scanf("%d",&b);
27         a=finds(a),b=finds(b);
28         if(a==b)  ans++;
29         else  par[a]=b;
30     }
31     return 0;
32 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
原文地址:https://www.cnblogs.com/Blogggggg/p/8410917.html