十字链表存储稀疏矩阵
课程设计
问题描述:    用十字链表存储稀疏矩阵,实现两个可进行矩阵之间的乘法运算。 
基本要求: (1)要对两个矩阵能否进行乘法进行判断。(2)对能够进行乘法运算的稀疏矩阵进行乘法运算并输出正确的结果。
参考博客
大致思路一般矩阵中会有很多值为0的元素,十字链表把这些值给忽略掉了,只存有值不为0的元素,每一行都是一个链表,每一列也是一个链表,用一个行指针、一个列指针指向它们,形成矩阵形式
数据类型123456789typedef struct OLNode{  //元素类型	int row,col;  //行列	ElemType val;  //数值	OLNode *right,*down;  //行指针、列指针}*OLink; struct CrossList{  //矩阵结构	int n,m,num;	OLink *Rhead,*Chead;  //指向行链表、列链表的指针};
初始化指针每次都要先把矩阵指针置为空
1234void InitCrossList(CrossList &CL){	CL.n=CL.m=CL ...
Binary Tree
实验目标:1、创建二叉树2、用非递归算法先中后序遍历二叉树 (难点)3、分别求出二叉树中度为 0、1、2的结点个数4、求出树的高度
参考博客:Article_1Article_2 
难点在于非递归遍历,用栈来模拟递归的过程
二叉树结构1234typedef struct node{	char data;	struct node *lchild, *rchild;}BiTNode,*BiTree;
创建二叉树12345678910void CreateBiTree(BiTree &t){	char ch; cin>>ch;	if(ch=='#') t=NULL;	else{		t=new node;		t->data=ch;		CreateBiTree(t->lchild);  //创建左子树 		CreateBiTree(t->rchild);  //创建右子树 	}}
层序遍历1234567891011121314void Level(BiTree L){ ...
倍增与tarjan求解lca
倍增
以倍增方式向上跳,时间复杂度是O(q*logn)
tarjan
树上算法,实现过程通过dfs+并查集来离线求出lca(最近公共祖先),时间复杂度O(n+q),n是结点数,q是查询数
算法实现过程倍增算法流程:
用一个dfs得出每一个点的父亲节点还有它的深度,用数组保存起来,其中保存父亲的数组用dp[i][j]表示,意义是i节点向上跳2^j^步后到达的节点,父亲节点保存在dp[i][0]中
12345678void dfs(int u,int fa,int d){  //得到每一个点的深度和父亲节点	dp[u][0]=fa;	dep[u]=d;	for(int i=head[u];~i;i=e[i].next){		int v=e[i].to;		if(v!=fa) dfs(v,u,d+1);	}}
然后倍增预处理出每一个节点向上跳2^i^步到的的节点
1234567void bz(){ //预处理	for(int i=1;i<=22;i++){		for(int u=1;u<=n;u++){ ...
KMP
暑假学习了KMP,奈何掌握不深,现在又来复习,结果又是从零开始
什么是KMP?现在有一个原字符串,再给你一段模式串,问你在原字符串中是否存在一段子串等于模式串,或者模式串在原串中出现几次?
BF算法,也就是人人都会的指针回朔暴力算法,略过
原串: ABABABAABA  (i)
模式串: ABAA (j)
当匹配时第一个失配的位置是3(下标从0开始),然后朴素做法是把i和j指针都回朔,但其实可以利用之前已经匹配的信息的,可以找到当前失配字符之前的最大公共前后缀长度,假设长度为k,则s[i-k]…s[i-1]==t[j-k]…t[j-1],而t[0]…t[k-1]==t[j-k]…t[j-1],所以s[i-k]..s[i-1]==t[0]…t[k-1],所以只需要把j移到k位置就可以了,i指针不回朔,这样一来就只要j指针回朔,而且大概率没有回朔到0,省去大量时间,那么问题就来了,怎么找到模式串中每一个位置的k呢?
前面已经说了,k是每一个位置之前字符串(不包括k位置)的最长公共前后缀长度,而公共前后缀与原串无关,只是在模式串中求即可
求解NEXT用next[i]表示i位置之前字符串的 ...
CCPC打铁记
2020年10月18日,这一天是我第一次打比赛的日子,非常有纪念意义,但是时至今日我才补了这篇文章
2020年注定是不平凡的一年,突如其来的疫情改变很多人的生活轨迹,原本该在这一年大展拳脚的学长们无奈只能在家里打着练习赛,然而对我们而言,有好也有坏吧,好的是我们有更多时间去提升自己(当然全靠自觉),坏的是少了许多阅历,不管怎样,终于在2020年8月29日我们开学了,开学后经过一个星期的过渡,又回到了算法的训练中去,在下面也打了许多训练赛,每次都紧紧抱着大佬的大腿,每次成绩也都还不错(不错指的是会的都比较快的做出来了),然而只要是dp只要是新算法我们就止步于此了
又过了一个月,我们迎来的这一年的CCPC邀请赛,首先是出线问题,最终学长们也都打进去了,我们19级的因为时间还多,机会就都留给学长们了,不过一星期后,老师跟我们说可以办外卡,也可以参赛拿奖,高兴了我一天,当时我以为是线下赛,想着终于可以出去涨涨见识了,然而第二天就丧了,因为疫情,这一年几乎所有比赛都是线上举行的!一下子感觉气氛都不对了,不过毕竟是比赛,比赛前我还是有去多刷题的,然而因为好多新算法都没学,有很多题目都是干瞪眼
 ...
LCA最小公共祖先
LCA 公共祖先什么是最小公共祖先,顾名思义就是俩点最近的公共祖先
如图所示:
2和5的最小公共祖先就是4
2和1的最小公共祖先就是4
3和5的最小公共祖先是1
那么怎么求呢?
先介绍两种朴素的做法,也就是超时的做法🐷
第一种: 向上标记法
想求两个点的最小公共祖先可以先从其中一个点往上找父亲结点,直到根节点,把路径标记一下,然后从另一个点开始做同样的操作,当遇到已经标记过的点的时候就停下来,这个点一定是最小公共祖先( 每次查询时间复杂度:O(n) )
CODE12345678910111213141516171819202122232425262728293031323334353637383940414243#include <bits/stdc++.h>using namespace std;const int MAXN=500100;vector<int> vt[MAXN];int fa[MAXN];bool vis[MAXN];void dfs(int u){	int len=vt[u].size();	for(int i=0;i&l ...
博弈论
注意注意注意: 异或运算符优先级比等于还要低!!!!二进制的运算符尽量都加上括号
必胜状态后继节点一定有必败
必败状态后继都是必胜
巴什博弈
数上博弈俩人轮流取数,一次可以取走1到m个数,假如有m+1个数,则第一个人怎么取第二个人都可以一次取走,第二个人就赢了,现在有x个数,这x个数可能是m+1的倍数,也可能不是,假设不是,那么那么第一个人就可以第一次取s个数,把m+1这个必败状态给对方,假如是,则自己就是必败了x=n*(m+1)+s
Brave game (HDU1846)1234567891011121314#include <bits/stdc++.h>using namespace std;int main(){    int t;    cin>>t;    while(t--){        int a,b;        cin>>a>>b;        int mod=a%(b+1);        if(mod>=1) cout<<"first"< ...
Millionaire Madness
计蒜客之前比赛的一道题目,记录一下
G Millionaire Madness
A close friend of yours, a duck with financial problems, has requested your help with a matter that will help him pay off his debts. He is the nephew of an extremely wealthy duck, who has a large vault, filled with mountains of coins. This wealthy duck has a certain coin in his possession which has a lot of sentimental value to him. Usually, it is kept under a protective glass dome on a velvet cushion.However, during a recent relocating of the coins in t ...
python_arrange
写这个代码花了一个小时,因为刚学了一点点OS模块,还不是很熟悉,写完后功能也都有,但是!!!导出为exe文件时不小心误删了py文件,气死我了!又重新写了一遍。
新加了GUI界面的整理页面小程序,效果如下图所示
GitHub项目地址 Here
效果图:
{height=”400”,width=”400”}
CODE1(不含有重命名)12345678910111213141516171819202122232425262728293031323334353637383940414243444546import osfrom shutil import copyfiledef create():    print('------创建文件夹------')    for i in var_list:        Path_now = os.path.join(Path, i).replace('\\', '/')        if(not os.path.exists(Path_now)):            os.m ...
浅谈哈希
前言
趁着还没忘记录一下吧🐷
哈希能干些啥?学一个新算法首先一定要知道学这个能干些啥对吧,我们是为了用某个东西而去学这个东西而不是盲目目的的学,现在假如给你两段字符串让你去比较他们是否相同,如果暴力做法就是从头到尾扫一遍,都相同则相同,复杂度为O(N),假如数据量非常大,而且字符串长度很大,现在题目就变成了给你n个字符串,现在又给你t个字符串问你每一个字符串是否在这n个字符串中,平常做法时间复杂度O(tt个字符串每一个字符串长度\n),若用哈希预处理时间复杂度降到O(t*字符串长度+n),也就是把那n个字符串预先处理一下,使得接下来比较每一个字符串时时间复杂度变成O(1),让我们来看一下具体怎么操作吧
思想其实哈希和二进制思想是类似的,如果让你比较两个二进制串是否相同,你肯定会想到把二进制转成十进制比较起来会更方便,因为复杂度降低到了O(1),不用你去逐位比较了,那字符串也是可以像二进制那样转换成为一个数字的,例如:abcd这个字符串可以转换成为ap^3^+b\p^2^+c*p^1^+d*p^0^,这里的p值是多少先不说,每一个字符都是有acall值的,我们可以直接利用这一点把每 ...



