博客作业-图

1.学习总结

1.1图的思维导图

 

1.2 图结构学习体会

深度遍历算法:使用递归方式,一个结点再往下一个结点的遍历,不遍历已访问过的结点

广度遍历算法:用队列的方式,将一个结点的周边结点扫入队列中,再按出队的顺序依次访问,重复操作。

Prim算法和Kruskal算法都是贪心算法,关于最小生成树的建立,两者都是很优秀的算法,,prim由
于要用到邻接矩阵,所以稠密图比较合适,kruskal要对所有的边排序,因此稀疏图比较合适。
所以采取那种算法可以取决是稠密图还是稀疏图来选择算法。

2.PTA实验作业

 

(1)7-1 图着色问题

设计思路:伪代码

使用回溯法将visited数组初始化为0;

k=0;

依次观察每一种颜色,若顶点之间的着色不冲突则转下一步骤,否则继续搜索

若顶点全部着色,输出数组

若顶点是一个合法着色,则转处理下一个

否则重置顶点颜色

代码截图

 

 

 

pta提交列表:

上方的编译错误情况,一方面为主函数输入时,b【c(i)】没有自加,导致程序内部出错,另一方面为没有把提交格式改为c++导致的。

 下方的答案错误是对于图着色时的合法判断语句实现出现不严谨的错误导致的。

(2)7-2 排座位

设计思路:伪代码

代码截图:

pta提交列表

本题较为简单,因为朋友的朋友也是朋友,是传递关系,因此考虑并查集,将直接或间接是朋友关系的元素加入集合

而敌人的敌人不一定是敌人,所以只需要用一个二维数组即可标记。

若两人是敌对关系,但同属于这个集合,则符合题意中“OK but...”这种情况

其余情况直接进行判断即可

并无遇到较大问题,仅仅是在提交格式上的疏忽导致两次编译错误,在这里未截出来

(3)7-3 六度空间

设计思路:伪代码

本题较前两题难度较大,以一人之力实在难以承担,学生不才,向网络求救,认真学习并深刻理解

代码截图

PTA提交列表说明:

第一次错误为没有带level==6时跳出循环,导致某些情况下循环无法终止而错误

第二次错误为在修改时误将倒数第三个后括号删去,导致结构出错,但是由于在第一种情况下并不会进入该函数,所以依旧有一部分正确

3.本周题目集的PTA最后排名

4. 阅读代码

代码如下:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3
#define MAX 510
int N, M, S, D;
int disGraph[MAX][MAX];
int priGraph[MAX][MAX];
int visited[MAX];
int dis[MAX];
int pri[MAX];
void InputData()
{
scanf("%d %d %d %d", &N, &M, &S, &D);
//初始化
for(int i = 0; i < N; ++i){
for(int j = 0; j < N; ++j){
disGraph[i][j] = priGraph[i][j] = inf;
}
}
//输入数据
for(int i = 0; i < M; ++i){
int pos1, pos2, lenth, price;
scanf("%d %d %d %d", &pos1, &pos2, &lenth, &price);
disGraph[pos1][pos2] = disGraph[pos2][pos1] = lenth;
priGraph[pos1][pos2] = priGraph[pos2][pos1] = price;
}
}
void Dijkstra()
{
//初始化
for(int i = 0; i < N; ++i){
dis[i] = pri[i] = inf;
visited[i] = 0;
}
pri[S] = dis[S] = 0;
visited[S] = 1;
for(int i = 0; i < N; ++i){
int mind = inf;
int mini = S;
for(int j = 0; j < N; ++j){
if(visited[j] == 0 && mind > dis[j]){
mini = j;
mind = dis[j];
}
}
visited[mini] = 1;
for(int j = 0; j < N; ++j)
{
if(visited[i] == 0 && dis[j] > dis[mini] + disGraph[mini][j]){
dis[j] = dis[mini] + disGraph[mini][j];
pri[j] = pri[mini] + priGraph[mini][j];
}
else if(visited[i] == 0 && dis[j] == dis[mini] + disGraph[mini][j]){
if(pri[j] > pri[mini] + priGraph[mini][j]){
pri[j] = pri[mini] + priGraph[mini][j];
}
}
}
}

}
int main()
{
InputData();
Dijkstra();
printf("%d %d", dis[D], pri[D]);

}

这是csdn知名博主林锦黛的代码,使用的是图的知识,利用广度遍历寻找每个人与其他人的关系并记录。

posted @ 2018-06-18 16:43  zzb1234  阅读(225)  评论(0编辑  收藏  举报