
PAT甲级 图问题
PAT上遇到的图问题
爱吃梦龙雪糕
这个作者很懒,什么都没留下…
展开
-
1146 Topological Order (25 分)
本题考察拓扑序列的判断方法坑点如下1,作为一个拓扑序列,依次把序列中的数取出,使得该数所连接的数的入度减一,在此情况下,每个数的入度均应该为零2,数组的拷贝(参考柳婼学姐)下面的代码将整型in数组拷贝到vector容器tin中vector<int> tin(in, in+n+1);整体代码如下#include<bits/stdc++.h>using namespace std;bool flag;vector<int>v;int n,m,q,b;原创 2022-03-02 18:46:18 · 141 阅读 · 0 评论 -
1150 Travelling Salesman Problem (25 分)
旅行商问题,首先判断是否为环路,之后判断是否为简单环路,最后输出最短距离坑点如下;1,判断所给图中连续的连点之间是否连通2,用set和vector结合的方式来判断是为简单回路整体代码如下#include<bits/stdc++.h>using namespace std;const int INF=0x3fffffff;int n,m,k,num,b,w,sdis,snum;int G[210][210];set<int>s;vector<int>t原创 2022-03-01 15:41:10 · 142 阅读 · 0 评论 -
1142 Maximal Clique (25 分)
判断是否图中任意两点两两相连,并判断是否存在图外一点与图中任意一点均存在连线本题坑点如下1,注意条件判断,一个一个依次判断;整体代码如下#include<bits/stdc++.h>using namespace std;set<int>s;vector<int>temp;int vis[210];int G[210][210];int isc,ismc,noc;int main(){ int nv,ne,m,k,num; int v原创 2022-03-01 14:28:46 · 142 阅读 · 0 评论 -
1126 Eulerian Path (25 分)
欧拉图的判断;坑点如下;1,若所有节点的度都为偶数,则为欧拉图2,若只有两个节点的度为偶数,则为半欧拉图3,另外还需判断可连通性整体代码如下#include<bits/stdc++.h>using namespace std;int n,m;vector<int>v[510];int odd=0;bool vis[510];int cnt=0;void dfs(int s){ vis[s]=true; if(v[s].size()==0)r原创 2022-02-28 23:16:22 · 152 阅读 · 0 评论 -
1122 Hamiltonian Cycle (25 分)
本题考查哈密顿图的判断哈密顿图 :经过图中所有的节点的圈坑点如下1,若图中有n个不同的顶点,则哈密顿图中的顶点数目一定为n+1;2,第一个顶点一定与最后一个顶点相同3,还需判断题目中所给的路径之间是否相连;整体代码如下#include<bits/stdc++.h>using namespace std;int n,m,k,num,b;int G[210][210];vector<int>path;set<int>s;bool flag1,flag原创 2022-02-28 22:43:55 · 68 阅读 · 0 评论 -
7-3 Telefraud Detection (25 分)
图论+并查集问题坑点如下1,利用line数组来依次判断可怀疑对象,将嫌疑人依次放入temp数组。2,在temp数组中用DFS方法,将所有存在相互通话的嫌疑人合并。3,DFS过程中temp1的顺序被打乱,需要重新排序。3,vector<vector>ans中sort函数的用法,如图,按照第一个元素大小排列,如相同,则按照下一个元素大小排列,直到排列完成。3 43 4 54整体代码如下#include<cstdio>#include<algorithm&原创 2021-09-05 13:44:33 · 119 阅读 · 0 评论 -
1142 Maximal Clique (25 分)
图问题,本题考察的知识点有,判断图中的最大全连通分量(团clique) 。坑点如下1,判断全连通的方法,如2,3,4,5四个结点顺序2,3,4,5.3,4,5.4,5.则四个结点全连通。整体代码如下#include<cstdio>#include<cstring>#include<vector>#include<set>using namespace std;vector<int>aj[210];int e[210][2原创 2021-08-29 20:45:40 · 88 阅读 · 0 评论 -
1139 First Contact (30 分)
图问题,考察的知识点有,字符串hash,vector中结构体数组的排序。坑点如下1,如果用int读入数据,则对-0000的数据无法判断性别,故用string储存。2,注意输出格式为04d%3,暗恋的人性别相同时找同性朋友时要避免找到暗恋的人。4,本题只用找同性朋友,因此用vector容器储存同性朋友。整体代码如下#include<bits/stdc++.h>using namespace std;int n,m,k;bool fri[310][310];unordered_原创 2021-08-27 18:17:10 · 267 阅读 · 0 评论 -
1134 Vertex Cover (25 分)
图问题,主要考察边的存储方式。坑点如下1,可将边都存入vector容器中,从而依次遍历所有边,如有一条不满足要求,则输出No,否则输出Yes整体代码如下#include<cstdio>#include<vector>#include<cstring>#include<set>using namespace std;vector<int>v[10010];set<int>s;bool vis[10010];int原创 2021-08-26 09:27:06 · 105 阅读 · 0 评论 -
1103 Integer Factorization (30 分)
深度优先搜素(DFS)问题,个人觉得要难于BFS问题坑点如下1,通过fac数组存储数字的p次方,fac[0]=0,fac[1]=1,fac[2]=4,以此类推;2,DFS函数如下采用堆栈实现,要注意的要点有1),在DFS开头指明递归边界2),采用全局变量maxindex来存储当前符合条件的最大底数之和3),注意vector的用法,两个vector变量可以直接赋值4),由于index最小为0,因此应设条件index>15),首先选择,选一条路径,之后不选择,再选一条路径void DF原创 2021-08-05 10:42:48 · 63 阅读 · 0 评论 -
1091 Acute Stroke (30 分)
广度优先搜索(BFS)问题,其中此题多了一个统计功能;坑点如下1,坐标的存储方式,采用结构体数组存储struct Node{ int x,y,z;}node;2,遍历方式,预先设计数组int X[6]={1,-1,0,0,0,0};int Y[6]={0,0,1,-1,0,0};int Z[6]={0,0,0,0,1,-1};3,关于判断,设置bool型inq数组判断该点是否已经入队,设置test函数判断该点是否需要入队,判断条件(该点在界限内&&该点还未入队)原创 2021-08-05 11:56:32 · 80 阅读 · 0 评论 -
1004 Counting Leaves (30 分)
家谱图问题,计算每层中叶子结点个数;坑点如下1,定义全局变量maxlevel记录最大深度。定义level数组记录每层叶子结点个数整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using namespace std;int n,m;const int maxn=110;int level[110]原创 2021-08-07 11:18:21 · 53 阅读 · 0 评论 -
1053 Path of Equal Weight (30 分)
带权树的路径问题,这题我一开始用的是BFS方法,之后发现可以求出路径数组,但在对数组从大到小排序的过程中遇到了无法解决的问题。理解题意后发现这题用DFS方法更为简便坑点如下1,熟悉DFS的模板,注意递归边界。2,若采用DFS方法,要使得路径从大到小依次输入,只需对每一个非叶子结点,将其子节点按权从大到小排列即可bool cmp(int a,int b){ return node[a].weight>node[b].weight;}3,本题我采用vector容器path记录当前节点原创 2021-08-07 17:19:48 · 83 阅读 · 0 评论 -
1034 Head of a Gang (30 分)
图的遍历问题,本题涉及到的知识点有1,计算图的总边权2,找出图中结点周围的总边权并找出具有最大总边权的结点3,统计一个连通分量的节点数4,考察图的遍历5,利用map将字符串转化成数字id坑点如下DFS代码如下void DFS(int index,int &head,int &number,int &total){ vis[index]=true; number++;//统计结点个数 if(weight[index]>weight[head原创 2021-08-11 13:36:48 · 60 阅读 · 0 评论 -
1076 Forwards on Weibo (30 分)
图的遍历问题,本题用BFS方法更为简便坑点如下1,本题要求返回层数小于等于l的间接转发数,则根结点层数为02,数组赋初值的方法 memset(vis,false,sizeof(vis));3,BFS方法细节int BFS(int first){ int num=0; queue<int>Q; Q.push(first); node[first].level=0; vis[first]=true; while(!Q.empty()){原创 2021-08-12 11:16:11 · 63 阅读 · 0 评论 -
1013 Battle Over Cities (25 分)
本题考察图去结点后的连通分量个数计算。坑点如下1,若city被占,则该city无法访问,即可设该vis[city]=true,或者在DFS遍历到被删city时返回即可。2,添加道路树为连通分量数-1,直接计算即可整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=1100;co原创 2021-08-12 12:10:17 · 77 阅读 · 0 评论 -
1021 Deepest Root (25 分)
本题考察的知识点有,计算图的连通分量个数,不同结点集的合并和去重,树的遍历并由一个初始结点统计出所到达的最深结点。坑点如下1,要求树中的最深的根结点,如下图,对任意结点求其到达的最深结点集A,在A中取任意结点求其所到达的最深结点B,A和B的并集即为所求。2,注意特殊情况n=1时能输出1.整体代码如下#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#inc原创 2021-08-13 09:13:17 · 134 阅读 · 0 评论 -
1003 Emergency (25 分)
本题涉及的知识点有,最短路径数目统计,在最短路径中找出点权最大的路径并求其最大点权。坑点如下1,最短路径数目统计,创建一个num数组来记录当前节点到起始点的最短路径数目int num[maxn]={0};2,最大点权统计int w[maxn];int weight[maxn];其中w[I]i到起始节点的最大点权之和,weight记录各节点点权3,dijkstra算法如下,注意初值的设定,d数组设无穷大,w[s]起始点权重,num[s]=1;void dijkstra(int s){原创 2021-08-13 11:03:20 · 61 阅读 · 0 评论 -
1018 Public Bike Management (30 分)
Dijkstra+DFS问题,本题涉及到的知识点有,最短路径统计,最短路径记录,路径优化坑点如下1,本题首先将所有最短路径统计出来。利用verctor容器2,利用DFS递归的方法,用vector容器temp将最短路径存储,并进行优化比较,总结出所求路径3,将bike数目整体减去cmax/2从而简化处理。4,注意点,在dijkstra中将d数初始化,在主函数中将G数组初始化,dijksra参数为初始结点,DFS参数为终止结点。代码如下#include<cstdio>#include原创 2021-08-13 17:47:38 · 70 阅读 · 0 评论 -
1030 Travel Plan (30 分)
dijkstra+DFS,本题涉及的知识点有,最短路径求取并统计,最短路径中求边权之和。坑点如下1,DFS中边权之和的求法 for(int i=temp.size()-1;i>0;i--){ int id=temp[i],next=temp[i-1]; //注意id和next分别表示当前结点和下一个结点 total+=C[id][next]; }整体代码如下#include<cstdio>原创 2021-08-13 18:27:29 · 59 阅读 · 0 评论 -
1072 Gas Station (30 分)
本题考察的知识点有,求图中到达指定点的最短路径所对应结点,如结点有多个求出其距离定点最远的结点,求路径的距离之和。坑点如下1,编号问题,要注意房子数目不止一个,否则最后一个测试点无法通过2,找出所求加油站,对各个加油站都采用一次dijkstra算法即可3,多次使用dijkstra算法时,要注意vis和d数组都要重新赋初值整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include&l原创 2021-08-13 21:29:21 · 100 阅读 · 0 评论 -
1087 All Roads Lead to Rome (30 分)
dijkstra+DFS问题,本题涉及到的知识点有,在图中查找并存储最短路径,统计最短路径条数,多条最短路径求点权之和最小,利用map的方法将字符串转化成编号坑点如下1,编号统计,写一个函数如下。可将接收到的字符串自动转化为相应编号。int strtoID(string a){ if(strtoid.find(a)==strtoid.end()){ strtoid[a]=citynum; idtostr[citynum]=a; return ci原创 2021-08-14 10:53:54 · 66 阅读 · 0 评论 -
1111 Online Map (30 分)
dijkstra+DFS标准题,本题使用两次即可坑点如下1,注意dijkstra算法循环不能写错2,注意输出格式,相同时中间为;而不是:Distance = 3; Time = 4: 3 -> 2 -> 5整体代码如下#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<vector>#include<queu原创 2021-08-17 15:56:47 · 64 阅读 · 0 评论