11.1听课记录

#include<bits/stdc++.h>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cmath>

头文件镇楼。

今天听了尧神的讲演

然而我又总是觉得什么都没有听到呢;

今天,到底讲了些什么呢

  1. dijkstra
  2. SPFA
  3. 图的遍历
  4. 如何构图
  5. 拓扑排序
  6. floyd
    仅此无余,仅此了;

一、图

图的构建一般有三种方法(前向星不常用);
一、邻接矩阵
先声明一下,邻接矩阵适用于点少边多的情况;
其中心思想是用一个bool数组来记录一个遍是否存在;
代码如下

int n,m;//n为点数,m为边数; 
bool flag[100][100];

int	main()
{
	cin>>n>>m;
	memset(flag,0,sizeof(flag));
	int x,y,z;//z为权值;
	for(int i = 1; i <= m; i++)
	{
		cin>>x>>y;
		flag[x][y] = z;
	}
}

即是如上(用于表示x与y之间有边 or 从x到y有一条有向边);

二、边表
这个就适用于点多边少的情况了;
用一个结构体(或两个一维数组)来记录每一条边的左右两个端点;
代码如下

int n,m;//n为点数,m为边数; 
struct node{
	int x;
	int y;
	int z;//同上,为权值;
}a[10000];


int	main()
{
	cin>>n>>m;
	for(int i = 1 ;i <= m; i++)
	{
		cin >> a[i].x >> a[i].y >> a[i].z;
	}
}

三、邻接表
最常用的来喽;
其中心思想较为憋屈;
下作简介;
就是先记录下每一条边的编号及其两端端点,然后以其一个端点为下标来记录这个点与这条边相连存入下一条有同样端点的边时再将这一条边引用;
代码如下;

#inlcude<bits/stdc++.h
using namespace std;
int len = 0;
int lin[100000];
struct node{
	int str;//这条边的起点 ; 
	int end;//其终点 ; 
	int value;//这条边的权值; 
	int next;//与这条边的起点相连的上一条边的编号; 
}a[1000005];

void add(int x, int y, int z)
{
	a[++len].str = x;
	a[len].value = z;//记录权值; 
	a[len].end = y;//因为上一步已经加过了,所以不用再加; 
	a[len].next = lin[x];//令这条边的关联边为上一个以x为起点的点; 
	lin[x] = len;//此步是为了记录下以x为起点的最近更新的一条边; 
}

int main()
{
	cin>>n>>m;
	for (int i=1;i<=m;i++)
	{
		cin>>x>>y>>z;
		add(x,y,z);
	}
}

呼!终于搞懂了呢,让我开心一会;
接下来,记什么好呢;
四、树
好的,下面来记树吧;
树者,有根有叶,四处开叉者也;
cout<<endl;
接下来,要进入算法阶段了
累了,写不下去了,剩下的下一次吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值