1.今天先看了一部分关于c++的部分函数用法
find(beg,end,v)//在beg和end内查找等于v的元素,找到返回
count(beg,end,v)//统计等于v的元素个数
lower_bound(beg,end,v)//查找非递减序列内第一个大于v的元素
upper_bound(beg,end,v)//查找非递减序列内第一个小于v的元素
还有就是sort函数,sort(begin,end)如果是这种类型的话,排序的函数就是升序排列,如果想要降序排列则在end后面还要加一个cmp函数变成sort(begin,end,cmp)即可。
bool cmp(int a,int b)
{ return a>b;}
还看见一个使用c++语言的万能头文件,c++目前自己就用这个头文件就可以了简便的多
#include<bits/stdc++.h>
using namespace std;
还有对于c++而言数据结构的一些内容也简化了很多,就像栈队列,什么的c++可以直接进行调用和应用。还掌握到一个小知识点,堆总是一棵完全二叉树。
2.还复习了一下昨天看的dfs,现在的话对dfs的感觉更好了一点,昨天的题目是无向图而今天用dfs
做了一个最短路径感觉还行。
#include<bitsdc++.h>
using namespace std;
int e[1000][1000],book[1000]={0},s=9999,n,m;
void dfs(int cur,int dis)
{
if(dis>s){return;}
if(cur==n)
{
if(dis<s){s=dis;}
return;
}
for(int i=1;i<=n;i++)
{
if(e[cur][i]!=9999&&book[i]==0)
{
book[i]=1;
dfs(i,dis+e[cur][i]);
book[i]=0;
}
}
return;
}
int main()
{
int i,j,k,a,b,c;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j){e[i][j]=0;}
else {e[i][j]=9999;}
}
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
e[a][b]=c;
}
book[1]=1;
dfs(1,0);
cout<<s;
感觉这里需要注意的唯一一点就是dfs算法中那个判断dis和s大小时的情况应该放在cur==n的情况内,当时自己写完后一直没检查出来,看书才发现。
3.今天除了用dfs写了最短路径也去学了一下dijkstra算法,大概是看懂了,但是实操起来还是不太熟练,明天务必好好复习一下,多写几遍。
#include<bitsdc++.h>
using namespace std;
int main()
{
int e[100][100],i,j,k,n,m,dis[10],book[10],u,v,a,b,c,s=9999;
int min1;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j){e[i][j]=0;}
else e[i][j]=s;
}
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
e[a][b]=c;
}
for(i=1;i<=n;i++)
{
dis[i]=e[1][i];
}
for(i=1;i<=n;i++)
{
book[i]=0;
}
book[1]=1;
for(i=1;i<=n-1;i++)
{ min1=s;
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<min1)
{
min1=dis[j];u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<s)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
cout<<dis[n];
getchar();getchar();
return 0;
}
今天写dijkstra算法时,写完检查错误检查了将近几十分钟,看了很多遍都没看出问题,甚至对着书检查都没检查出来,最后发现是双循环的时候两个循环参数都用的i,直接裂开了,这种简单的错误检查了十几二十分钟都没看出来,以后务必牢记!!!
今天由于感冒自习状态太差,效率太低,还需好好调整,之后把自习效率提上来,不能每次都学这么一点点东西。