题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1272
题意描述:图里现存两种连接方式(通道):tunnel和bridge,修地铁顾名思义在地下,所以bridge尽量少;那么任务就是用现有的两种通道建立连通图,给出需要的最少的bridge数;
思路就是并查集,先用tunnel合并,再用bridge合并;
AC代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
struct Node{
int x, y;
};
vector<int>parent;
int getParent(int num){
return num == parent[num] ? num : parent[num] = getParent(parent[num]);
}
bool link(Node *node){
int a = getParent(node->x);
int b = getParent(node->y);
if (a != b){
parent[a] = b;
return true;
}
return false;
}
void func(){
int N, T, B;
cin >> N >> T >> B;
for (int i = 0; i <= N; i++)
parent.push_back(i);
Node node;
for (int i = 0; i < T; i++){
cin >> node.x >> node.y;
link(&node);
}
int ans = 0;
for (int i = 0; i < B; i++){
cin >> node.x >> node.y;
if (link(&node))ans++;
}
cout << ans << endl;
}
int main(){
freopen("out.txt", "w", stdout);
freopen("in.txt", "r", stdin);
func();
}