PAT甲级1013. Battle Over Cities

PAT甲级1013. Battle Over Cities

题意:

将所有城市连接起来的公路在战争中是非常重要的。如果一个城市被敌人占领,所有从这个城市的高速公路都是关闭的。我们必须立即知道,如果我们需要修理任何其他高速公路,以保持其他城市的连接。鉴于所有其余高速公路标记的城市地图,
你应该告诉高速公路需要修理的次数很快。

例如,如果我们有3个城市和2个连接city1-city2和city1-city3的高速公路3。那么如果city1被敌人占领,那么我们必须有1条公路修好,那就是高速公路city2-city3。

输入

每个输入文件包含一个测试用例。
每个案例分别以3号数字N(<1000),M和K分别开始,分别是城市总数,剩余高速公路数和待检查城市数。然后M行跟随,每个描述一条公路由2个整数,这是高速公路连接的城市的数量。
城市的编号从1到N.最后有一行包含K个数字,代表我们关心的城市。

输出

对于每个K个城市,如果该城市丢失,一条线上的公路数量需要修复。

思路:

求连通支路。并查集或者dfs都可以。

ac代码:

C++ 并查集

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<unordered_map>
#include<cstring>

using namespace std;

const int maxn = 1005;
int mapx[maxn * maxn][2];
int pre[maxn];

int Find(int x)
{
	return pre[x] == x ? x : pre[x] = Find(pre[x]);
}

void Union(int x, int y)
{
	x = Find(x);
	y = Find(y);
	if (x == y) return;
	pre[y] = x;
}

int main()
{
	int n, m, k, sum;
	cin >> n >> m >> k;
	memset(mapx, 0, sizeof(mapx));
	for (int i = 0; i < m; i++)
	{
		cin >> mapx[i][0] >> mapx[i][1];
	}

	int city;
	while (k--)
	{
		cin >> city;
		for (int i = 0; i <= n; i++)
		{
			pre[i] = i;
		}

		for (int i = 0; i < m; i++)
		{
			if (mapx[i][0] != city && mapx[i][1] != city)
				Union(mapx[i][0], mapx[i][1]);
		}

		sum = 0;
		for (int i = 1; i <= n; i++)
		{
			if (pre[i] == i && i != city)
				sum++;
		}

		cout << sum - 1 << endl;
	}
    return 0;
}

C++ dfs

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<unordered_map>
#include<cstring>

using namespace std;

const int maxn = 1005;
int visit[maxn];
int link[maxn][maxn];
int n, m, k;

void dfs(int x)
{
	visit[x] = 1;
	for (int i = 1; i <= n; i++)
	{
		if (visit[i] != 1 && link[i][x] == 1)
			dfs(i);
	}
}

int main()
{
	cin >> n >> m >> k;
	int city1, city2;
	memset(link, 0, sizeof(link));
	for (int i = 0; i < m; i++)
	{
		cin >> city1 >> city2;
		link[city1][city2] = 1;
		link[city2][city1] = 1;
	}

	int misscity;
	int count;
	for (int i = 0; i < k; i++)
	{
		cin >> misscity;
		count = 0;
		memset(visit, 0, sizeof(visit));
		visit[misscity] = 1;
		for (int i = 1; i <= n; i++)
		{
			if (visit[i] != 1)
			{
				dfs(i);
				count++;
			}
		}
		cout << count - 1 << endl;
	}
	return 0;
}

原文地址:https://www.cnblogs.com/weedboy/p/7247875.html