PAT(甲级)1013笔记---测试点0、2未通过

PAT(甲级)1013笔记—测试点0、2未通过

1. 原题参照PAT官网

战争中非常重要的是让所有的城市被高速公路连接起来,如果一个城市被敌人占领,所有来自/通往这个城市的高速公路都会被截断关闭。我们必须立即知道,如果我们需要保持所有的高速公路能连接剩下全部的城市,给地图上所有有剩余高速公路的城市做标记,你需要迅速告知需要补修几条高速公路。
比如,如果我们有三个城市和两条高速公路连接city1-city2 和city1-city3。那么如果city1被敌人占据,我们必须再修一条高速公路city2-city3。
输入:每个输入有一个测试用例,每个测试用例第一行有3个数字N(<1000),M和K,分别为城市总数,剩余高铁数量,以及多少城市需要检查。之后会有M行列出,每行用两个整数描述一条高速公路,是这条高速公路连接的城市,这个城市是1到N的数字,最后,有一行包含K个数字,表示我们concern关注的城市。
输出:每个K城市,若该城市消失了,我们需要修复几条高速公路。

思路:连通图问题
建立连通图,然后对每个关注的结点,如果删除该节点及其相连的线,可以形成n个连通图,需要建立n-1条公路即可。

2. 生词记录
  • emphasizing -v. 强调(emphasize的现在分词)
3. 知识点【& Question】
  • 哭了,先说下思路吧,vector<vector E用来表示边,就是E[ i ][ j ]如果是true,就意味着 i 到 j 有高速公路可通行。
  • 之后DFS的思路是,遇到concern的点就拒绝通过这个点继续深入,然后经过的点用visit记录下来,把所有的点遍历后,看看用了几次DFS(此处特指一开始用的)。我觉得这个思路莫问题,答案算出来也是对的,但是第0个测试点和第2个测试点始终无法通过,不理解是为什么。
#include<stdio.h>
#include<iostream>
#include<vector>
#include <iomanip>
using namespace std;




void DFS(vector<bool> &visit, vector<vector<bool>> &E, int index,int nokey) {

	visit[index] = true;
	for (int i = 1; i < visit.size(); i++)
	{
		if (E[index][i]==true && visit[i]==false&&(i!=nokey))//index到i之间有边且i未被访问
		{
			DFS(visit, E, i, nokey);
		}
	}
}


int main() {
	

	//输入一个图
	int N, M, K;
	cin >> N >> M >> K;
	vector<vector<bool>> E(N + 1);//边
	vector<bool> visit(N + 1,false);
	vector<int> concern(K);//需要考虑的K个结点
	//输入要关注的城市节
	

	for (int i = 1; i <= N; i++){   ///初始化容器的时候只有一级,要定义两级
		E[i].resize(N + 1);
        E[i][i] = true;
	}

	for (int i = 0; i < M; i++){
		int TEMP1, TEMP2;
		cin >> TEMP1 >> TEMP2;
		E[TEMP1][TEMP2] = true;
		E[TEMP2][TEMP1] = true;
        
	}
	
	for (int j = 0; j < K; j++)///遍历查询关心的节点值
	{
		int TEMP;
		cin >> TEMP;
		int caculate = 0;
		for (int k = 1; k < N; k++)visit[k] = false;
		for (int no = 1; no <= N;no++)//循环所有的结点
		{
			if (visit[no] == false&&(no!=TEMP)) {
				DFS(visit, E, no,TEMP);
				caculate++;
			}
		}
		concern[j]= caculate-1;
	}
	for (int j = 0; j < K; j++) {
		cout << concern[j] << endl;
	}
	
	

	return 0;
}
4. 代码record

这个时候就要屈服于网上大神们的思路而放弃自己的,哭哭TAT ! ! !

啊啊啊啊啊啊啊也是遇到关心的点就拒绝访问,不用考虑跳过,直接把visit[concern [ i ] ]置为true,就可以了,但是我的为啥错捏,为啥捏,我还是不理解。

#include<stdio.h>
#include<string>
#include<queue>
#include<stack>
#include<iostream>
#include<vector>
#include <iomanip>
#include<algorithm>
using namespace std;
#define MAXSIZE 30




void DFS(vector<bool> &visit, vector<vector<bool>> &E, int index) {

	visit[index] = true;
	for (int i = 1; i < visit.size(); i++)
	{
		if (E[index][i]==true && visit[i]==false)//index到i之间有边且i未被访问
		{
			DFS(visit, E, i);
		}
	}
}


int main() {
	

	//输入一个图
	int N, M, K;
	cin >> N >> M >> K;
	vector<vector<bool>> E(N + 1);//边
	vector<bool> visit(N + 1,false);
	vector<int> concern(K);//需要考虑的K个结点
	//输入要关注的城市节
	

	for (int i = 1; i <= N; i++){   ///初始化容器的时候只有一级,要定义两级
		E[i].resize(N + 1);
		E[i][i] = true;
	}

	for (int i = 0; i < M; i++){
		int TEMP1, TEMP2;
		cin >> TEMP1 >> TEMP2;
		E[TEMP1][TEMP2] = E[TEMP2][TEMP1] = true;
		
	}
	for (int i = 0; i < K; i++)
	{
		int a;
		cin >> a;
		concern[i] = a;
	}

	for (int i = 0; i < K; i++)
	{
		for (int v = 0; v < visit.size(); v++)
		{
			visit[v] = false;
		}
		int cnt = 0;   //计算图的连通分量
		visit[concern[i]] = true;
		for (int j = 1; j <= N; j++) {
			if (!visit[j])
			{
				DFS(visit, E, j);
				cnt++;
			}
		}
		if (i < K - 1) cout << cnt - 1 << endl;
		else cout << cnt - 1;
		
	}



	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值