#include<bits/stdc++.h> using namespace std; int s[10]={0},dis[10],path[10],maps[15][15],nums,end; struct node{ int u; int v; int w; }edge[20]; int dijkstra(int x) { int min=100,flag=0; for(int i=1;i<=nums;i++) { if(s[i]!=1) { if(dis[x]+maps[x][i]<dis[i]) { dis[i]=dis[x]+maps[x][i]; path[i]=x; } if(maps[x][i]<min) { min=maps[x][i]; flag=i; } } } path[flag]=x; dis[flag]=dis[x]+maps[x][flag]; s[x]=1; if(flag!=end) dijkstra(flag); } int main() { int star,m; cin>>star>>end>>nums>>m; memset(maps,0x3f,sizeof(maps)); for(int i=1;i<=m;i++) { cin>>edge[i].u>>edge[i].v>>edge[i].w; maps[edge[i].u][edge[i].v]=edge[i].w; } memset(dis,0x3f,sizeof(dis)); dijkstra(star); m=end; cout<<"<-"<<end; while(m!=star) { m=path[m]; cout<<"<-"<<m; } cout<<"<-"<<star; } 修改错误
时间: 2024-01-01 19:05:30 浏览: 82
这段代码存在一些错误,需要进行修改。具体问题如下:
1. 函数 `dijkstra` 的返回类型应该为 `void`,因为它并不需要返回任何值。
2. 变量 `min` 的初始值应该设为一个较大的数,以确保算法正常运行。
3. 在每次更新 `dis` 数组的时候,需要同时更新 `path` 数组。
下面是修改后的代码:
相关问题
#include<bits/stdc++.h> using namespace std; int s[10],dis[10],path[10],maps[15][15],nums,end; int dijkstra(int x) { int min=100,flag=0; for(int i=1;i<=nums;i++) { if(s[i]!=1&&maps[x][i]!='*') { if(dis[x]+maps[x][i]<dis[i]) { dis[i]=dis[x]+maps[x][i]; path[i]=x; } if(maps[x][i]<min) { min=maps[x][i]; flag=i; } } } path[flag]=x; dis[flag]=dis[x]+maps[x][flag]; s[x]=1; if(flag!=end) dijkstra(flag); } int main() { int star,m; cin>>star>>end>>nums; for(int i=1;i<=nums;i++) for(int j=1;j<=nums;i++) cin>>maps[i][j]; memset(s,INT_MAX,sizeof(int)); dijkstra(star); m=end; cout<<"<-"<<end; while(m!=star) { m=path[m]; cout<<"<-"<<m; } cout<<"<-"<<star; } ysm问题
这段代码是实现Dijkstra算法的,用于求解有向带权图中单源最短路径问题。 代码中变量含义如下:
- s数组:用于记录节点是否已经被访问过,1表示已访问。
- dis数组:用于记录源节点到各个节点的最短距离。
- path数组:用于记录最短路径上各个节点的前驱节点。
- maps数组:存储有向带权图的邻接矩阵。
- nums变量:表示有向带权图的节点数。
- star变量:表示源节点。
- end变量:表示目标节点。
你还有其他问题吗?
#include<bits/stdc++.h> using namespace std; const int maxn = 500; queue<pair<int, int> >q; bool vis[maxn][maxn]; int n, m, len[maxn][maxn],dis[8][2] = {1, 2, 2, 1, 1, -2, 2, -1, -1, 2, -2, 1, -1, -2, -2, -1}; void bfs() { q.push(make_pair(n, m)),vis[n][m] = 1; while (!q.empty()) { int x = q.front().first,y = q.front().second; q.pop(); for (int i = 0; i < 8; i++) { int dx = x + dis[i][0],dy = y + dis[i][1]; if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && !vis[dx][dy]) { vis[dx][dy] = 1,len[dx][dy] = len[x][y] + 1,q.push(make_pair(dx, dy)); } } } } int main() { scanf("%d%d",&n,&m); memset(len, -1, sizeof(len)),len[n][m] = 0; bfs(); printf("%d",len[1][1]); return 0; }
这是一个使用BFS算法求解马走日问题的代码,其中使用了一个二维数组vis来标记每个位置是否已被访问过,使用len数组来记录每个位置到起点的最短步数。马走日问题是指在国际象棋棋盘上,马的走法是一步横走2格或一步竖走2格,再向左或向右拐个弯走一格,问马走到棋盘的某一格时,需要走几步才能到达。这个问题可以使用BFS算法求解,从目标格开始向四周进行搜索,直到找到起点为止。
阅读全文