1.1图的思维导图
1.2 图结构学习体会
在图的学习中,理论知识我能够掌握的比较牢固,但是在理论知识向代码过度的过程中就会有些麻烦,这一章的代码普遍结构体复杂变量繁琐,一不小心就很容易迷糊,希望能在理论的巩固中加深对代码的理解。
深度遍历算法:从图中某个顶点出发,按照某种搜索方法沿着图的边访问图中所有的顶点,使每个顶点仅仅被访问一次
广度遍历算法:首先访问初始顶点v,接着访问顶点v的所有未被访问过的邻接点,再按照v1,v2,v3....的次序依次访问所有未被访问过的邻接点
Prim算法:初始化顶点,然后再在该顶点候选边中挑选出权值最小的边直到包含(n-1)条为止
Kruscal算法:将图中的边按照权值从小到大的顺序依次选取且保证不形成回路
Dijkstra算法:选取一个顶点u,顶点v与顶点u距离最小就把顶点u加入到边集中
拓补排序算法:从有向图中选取一个没有前驱的顶点并且输出它,再删去该顶点找下一个没有前驱的顶点
2.PTA实验作业
7-1图着色问题
2.1设计思路
for i=0 to z
将所有边构成的数组初值置1
end for
进入子函数tzs:
for i=1 to v
进入递归函数tzs1:
for j=1 to v
存放终边值为后面查看是否着色成功做准备
循环n次
如果颜色种类与定义不同,输出no
如果相邻边颜色相同,也输出no
查看成功输出yes
2.2代码截图
2.3 PTA提交列表说明
问题:着色无冲突回溯时的二维数组的应该怎么填一直没有理清楚,就纠结了很久
7-2排座位
2.1设计思路
for i=1 to n
将所有客人的值和其数组地址对应方便后面排序
for i=1 to n
依次输入x,y,z并且将G[x][y]以及G[y][x]赋值为1 或-1
If z为1
将两人标记为朋友
for i=1 to k
If G[a][b]==1 No Problem
Else if G[a][b]==-1
If 两人为敌人但有共同朋友 OK but...
Else No way
Else OK.
2.2代码截图
2.3 PTA提交列表说明
问题:理解题意有点儿问题(就朋友的朋友一定是朋友那一段一直没整明白),然后再写成代码的时候就没有把全部情况考虑清楚导致一直部分正确,后来询问同学才改正过来
7-4公路村村通
2.1设计思路
Scanf 城镇数 候选道路数
Create邻接表
Prim解决(最小生成树)
2.2代码截图
2.3 PTA提交列表说明
问题:修改Prim来满足这一题的条件是一直没有修改好,不连通的情况一直没有办法通过,后来询问同学改正过来。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:2.5分
4. 阅读代码(贪心算法)
一个序列代表每天股票卖出价格,贪心法,分别找到价格最低和最高的一天,低进高出,注意最低的一天要在最高的一天之前且只能交易一次。遍历一次,由局部推出全局最优。
- int maxProfit(vector<int>& prices){
- int res=0;
- if(prices.size()<=1)return res;
- int curmin=prices[0];
- for(int i=0;i<prices.size();i++)
- {if(curmin>prices[i])curmin=prices[i];
- if(res<(prices[i]-curmin))res=(prices[i]-curmin);
- }//只要大于前者就是收益
- return res;
- }
相比121,本题有多次买卖机会,同一时刻只能持有一个股票,只有当当前的股票卖掉才能买新的股票。例如:2 3 1 5 6 9 2 那么最大的利益就是2-3和1-9段相加为9。故只需找出局部递增序列。
- int maxProfit(vector<int>& prices) {
- int res=0;
- if(prices.size()<=1)return res;
- for(int i=0;i<prices.size();){
- int j=i;
- while(j+1<prices.size()&&prices[j+1]>prices[j])j++;
- if(j==i){i++;}//一开始就不增加
- else {res+=prices[j]-prices[i];i=j+1;}//增加若干
- }
- return res;
- }
该题最多两次交易。类似121,只不过考虑到最多两次交易,可从前后两段开始。
- int maxProfit(vector<int>& prices) {
- int res=0;
- if(prices.size()<=1)return res;
- //分前后两段
- vector<int> pre(prices.size(),0);
- vector<int> aft(prices.size(),0);
- //pre iterator
- int curmin=prices[0];
- for(int i=1;i<prices.size();i++){
- if(curmin>prices[i])curmin=prices[i];
- pre[i]=max(prices[i]-curmin,pre[i-1]);
- }
- //after
- int curmax=prices[prices.size()-1];
- for(int i=prices.size()-2;i>=0;i--){
- if(curmax<prices[i])curmax=prices[i];
- aft[i]=min(prices[i]-curmax,aft[i+1]);//负数
- }
- //merge
- for(int i=0;i<prices.size();i++)
- if(res<pre[i]-aft[i])res=pre[i]-aft[i];//负数,所以减去aft
- return res;
- }