您的位置:首页 > 其它

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

2020-02-06 09:40 337 查看

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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
见鹿JOY 发布了16 篇原创文章 · 获赞 0 · 访问量 213 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: