zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    laravel 安装及入门
    mysql事务处理的意义
    PHP项目:如何用PHP高并发检索数据库?
    inner join、left join、right join等的区别
    百度地图引入网页中
    google地图引入网页
    thinkphp的mvc理解
    SpringBoot+Shiro入门小栗子
    Springboot+WebSocket+Kafka(写着玩的)
    Windows下安装单机Kafka
  • 原文地址:https://www.cnblogs.com/weedboy/p/7247875.html
Copyright © 2011-2022 走看看