好家伙,强制要求要刷力扣哎呀!!
不写不知道,一写下一跳和我之前用的平台完全不一样,写的是奇奇怪怪的,看题解看了半天(看格式)
不管了,慢慢的适应吧,也许这就是代码的最规范的书写
学长今天讲了图
我对prim算法以及迪杰斯特拉,的印象有些模糊了
所以在这继续复习复习一下
prim算法是求最小生成树的
在我的理解就是,直接生成树,把一个一个的点拉入树内,每次拉的点都是离树最近的进树
进入树内就打上标记,且要遍历一遍以这个点更新一遍离树的最短距离
最后点都进入了树就完成了
#include
int map[5010];//记录是否用过。
int dis[5010];
int max=1999999;
int maps[5010][5010];//记录边距的数组如maps[1][3]=3表示点一到点3的距离为3
long long sum;
long long min;
int hh=0;
int next;//新加入树的点
void beg(int a){
for(int hg=1;hg<=a;hg++)
{
for(int jk=1;jk<=a;jk++){
maps[hg][jk]=max;
maps[jk][hg]=max;
}
}
}
int main(){
int n,m;//点和边的数量
int a,b,c;//输入的数据
int jl;//就是一个用于循环的变量
scanf("%d%d",&n,&m);
beg(n);
for(int h=1;h<=m;h++){
scanf("%d%d%d",&a,&b,&c);
if(c
很典型的求最小生成树
也可以把条件改改
变成求最大的也是ok的
印象直接加深了呀
ok接下来是迪杰斯特拉算法
和floyed基本的原理是一样的,dp思想了,但是不需要遍历一边1到n只求s一个点到其他点的最短距离,求得东西变少了,时间复杂度也变成了o(n2)了,但是代码复杂了许多.
首先用邻间矩阵存边,不联通的就是无穷(边可以有向也可以无向 区别就是改几行代码的事)
开一个p数组是打标记数组,ans数组就是答案数组
初始化时ans[n]=a[s][n];就是那s点到n点的距离直接放进去(只是初始化)
然后把s点自己在p数组内打上标记t[s]=0自己到自己的距离就是0
随后遍历一遍t数组取距离最小的且为打上标记的为next,p[next]上标记,
以next为中间点遍历(p数组标记的就不要遍历了),要是t[n]>t[next]+a[next][s]就更新为t[next]+a[next][s]
经过,n-1的遍历全部的点都打上了标记,就结束了
此时的t[]数组在不断的遍历下变成了s点到其他点的最短距离了
#include
int map[1001000]={0};//为0的就是T标号
long long dis[1001000];
long long max=2147483647;
void bg(int u){//赋初值函数
for(int h=1;h<=u;h++){
dis[h]=max;
}
}
struct node{
int to;
int chang;
int next;//上一条是边数据的下标
}nodes[1001000];
long long min(long long jl,long long jk){
if(jl
翻自己的代码,没找到用邻间矩阵存边就找了用链式前向星的代码(一定是当时写的题目对空间卡的紧了) ,没有关系,顺便复习一下链式前向星.
ok
写力扣就不写在这了,全是最基础的题目,等两天我习惯了力扣的代码书写,顺便学一点c++的语法来开荒力扣
bbb
撒花谢幕!!!!!