今天复习了一下dfs和dijkstra算法以及浅学了一下java
对于dfs算法来说,如其名depth深度,就相当于搜到底。
今天做的是啊哈算法上的最短路径用的上述两种算法,对于dfs的代码而言如下
#include<bits/stdc++.h>
using namespace std;
int min1=99999;
int q[20][20];
int book[100]={0};
int n,m;
void dfs(int cur,int sum)
{
int i,j,k;
if(sum>min1)return;
if(cur==n){
if(sum<min1){min1=sum;}
return;}
for(j=1;j<=n;j++)
{
if(q[cur][j]!=99999&&book[j]==0)
{
book[j]=1;
dfs(j,sum+q[cur][j]);
book[j]=0;
}
}
return;
}
int main()
{
int i,j,k,s,a,b,c;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j){q[i][j]=0;}
else {q[i][j]=99999;}
}
while(m--)
{
cin>>a>>b>>c;
q[a][b]=c;
}
book[1]=1;
dfs(1,0);
cout<<min1<<endl;
return 0;
}
总的来说写出来不难, 需要注意的是这个n和m需要放在全局变量,不然的话在dfs函数中就会将n乱给值导致最后求不出最小路径。关于题的话还是做少了不知道在各个题的用法是否相同,还是得多做。
dijkstra算法的代码如下
#include<bits/stdc++.h>
using namespace std;
int e[100][100],book[100]={0},n,m,min1=9999,dis[10]={0};
int main()
{
int i,j,k,a,b,c,s,u,v;
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;
}
for(i=1;i<=n;i++)
{
dis[i]=e[1][i];
}
book[1]=1;
for(i=1;i<=n-1;i++)
{
min1=9999;
for(j=1;j<=n;j++)
{
if(dis[j]<min1&&book[j]==0)
{
min1=dis[j];
u=j;
}
}book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<9999)
{
if(dis[v]>e[u][v]+dis[u])
{
dis[v]=e[u][v]+dis[u];
}
}
}
}
cout<<dis[n];
}
对于此算法就关键点就是将1到个点的位置放在一个dis一维数组上,稍微容易错的地方就是
此处的e[u][v]数组的判断不能用min1来判断因为在上面循环后min1的值已经被改变了。
对于今天学的java感觉没学啥,写了一个helloworld还不是用编译器弄得还是用记事本,最后还没写出来,没找到错误,痛苦,主要下载了jdk啥的,
这是相应文件目录所对应的一些功能吧,也不知道有啥用,还有就是学了个环境变量,用cmd窗口打开程序更快,正好吧昨天不小心吧qq的窗体标删除了找半天也找不到以后也可以用cmd窗口来打开qq,主要操作方法就是在我的电脑右键打开属性,搜索高级属性设置,点击path将想要打开程序的文件路径复制在里面,即可。