int main() { int e[N][N], i, j, n, m, t1, t2, t3; while (scanf("%d%d", &n, &m) != EOF) { for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &e[i][j]); if (e[i][j] == 0 && i != j) { e[i][j] = INF; } } } int *dis = dijkstra(e, m, n); for (i = 0; i < n; i++) { if (i != m && dis[i] != INF) { printf("%d ", dis[i]); } if (dis[i] == INF) { printf("-1 "); } } printf("\n"); } return 0; }
时间: 2024-02-02 21:03:01 浏览: 26
这是一个使用 Dijkstra(迪杰斯特拉)算法求解单源最短路径的程序。其中,e[N][N] 是一个邻接矩阵,表示有向图中每条边的权值;n 表示有向图中节点的数量;m 表示起点节点的下标。
程序首先读入邻接矩阵 e[N][N];然后,将所有权值为 0 的边(除了自环)都替换为无穷大 INF;接着,调用 dijkstra 函数(不在这个代码中)求出起点 m 到其他节点的最短路径;最后,输出起点 m 到其他节点的最短距离,如果从起点 m 无法到达某个节点,则输出 -1。
相关问题
密密被困在一个迷宫里,迷宫有n个路口,编号为1-n。密密现在站在第一个路口,出口编号为m。先给出每个路口通向何处,问密密能否逃出迷宫。 编程要求 输入 多组数据,每组数据n+2行。第一行为一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口。最后一行为一个正整数m代表迷宫的终点。当n=0时输入结束。 输出 每组数据输出一行,若密密能走出迷宫,输出“YES”,否则输出“NO”。 测试说明 平台会对你编写的代码进行测试: 测试输入: 6 0 2 0 3 5 6 0 0 4 0 0 0 0 0 0 7 0 0 7 3 2 0 0 0 0 0 0 0 0 3 0 预期输出: YES NO#include <iostream> using namespace std; int m,n;//m:出口编号 n:入口 int tag;//输出标记 int DFS(int k,int (*a)[3]) {//深度搜索第k层,k:当前路口 /**************begin************/ //如果当前路口标记为1或者已经走过,返回0(不能继续往下走) if(a[k][1]==-1||a[k][1]==0) return 0; a[k][1]=-1;//标记已经走过 if(k==m)//如果到达出口 { tag=1;//标记已经可以通关 return 1; } int t1=0,t2=0,t3=0;//上、右、下分别标记是否能够通过 if(a[k][0]!=0) t1=DFS(a[k][0],a); if(a[k][1]!=0) t2=DFS(k+1,a); if(a[k][2]!=0) t3=DFS(a[k][2],a); if(t1+t2+t3!=0)//只要有一个方向能够通过,则当前路口标记为1 { a[k][1]=1; return 1; } else return 0; /**************end************/ } int main() { while(cin>>n) { if(n==0)break; int i,j; tag=0; int a[n+1][3];//迷宫 for(i=1;i<=n;i++) for(j=0;j<3;j++) cin>> a[i][j]; cin>>m; DFS(1,a);//从第一层开始搜索 if(tag==1) cout<<"YES"<<endl; else if(tag==0) cout<<"NO"<<endl; } return 0; }
代码看起来比较完整,但是似乎没有给出具体的解释。下面是代码的解释和注释:
```c++
#include <iostream>
using namespace std;
int m,n;//m:出口编号 n:入口
int tag;//输出标记
int DFS(int k,int (*a)[3]) {//深度搜索第k层,k:当前路口
//如果当前路口标记为1或者已经走过,返回0(不能继续往下走)
if(a[k][1]==-1||a[k][1]==0)
return 0;
a[k][1]=-1;//标记已经走过
if(k==m)//如果到达出口
{
tag=1;//标记已经可以通关
return 1;
}
int t1=0,t2=0,t3=0;//上、右、下分别标记是否能够通过
if(a[k][0]!=0) t1=DFS(a[k][0],a);
if(a[k][1]!=0) t2=DFS(k+1,a);
if(a[k][2]!=0) t3=DFS(a[k][2],a);
if(t1+t2+t3!=0)//只要有一个方向能够通过,则当前路口标记为1
{
a[k][1]=1;
return 1;
}
else return 0;
}
int main() {
while(cin>>n)
{
if(n==0)break;
int i,j;
tag=0;
int a[n+1][3];//迷宫
for(i=1;i<=n;i++)
for(j=0;j<3;j++)
cin>> a[i][j];
cin>>m;
DFS(1,a);//从第一层开始搜索
if(tag==1)
cout<<"YES"<<endl;
else if(tag==0)
cout<<"NO"<<endl;
}
return 0;
}
```
首先,程序会读入一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口。最后一行为一个正整数m代表迷宫的终点。
然后,程序会调用DFS函数进行深度搜索。DFS函数会接收两个参数:当前路口k和一个表示迷宫的数组a。DFS函数的返回值是一个int型的值,表示从当前路口是否能够到达出口。
在DFS函数内部,首先会判断当前路口是否已经走过,如果已经走过,则返回0,表示不能继续往下走。如果当前路口是出口,则标记已经可以通关,并返回1,表示已经到达出口。
如果当前路口不能到达出口,则需要进行深度搜索。根据题目描述,每个路口有三个方向:向左、向前、向右。因此,在DFS函数中,需要分别判断这三个方向是否能够到达出口。如果可以到达,则继续往下走;否则,返回0,表示不能继续往下走。
最后,如果当前路口的三个方向都不能到达出口,则返回0。如果有一个方向能够到达出口,则标记当前路口已经可以通行,并返回1。
在主函数中,程序会读入多组数据,对于每组数据,程序会先读入迷宫的信息,然后调用DFS函数进行深度搜索。如果DFS函数返回1,则输出"YES";否则,输出"NO"。
帮我补全以下代码//主函数界面// viod zcd() { int n=o; char n; systen("cls");//清屏// printf("按任一键进入主菜单\n"); print("\n"); printf("\t\t皖江工学院欢迎您\n"); printf("\n\t\t----------欢迎使用简单成绩管理系统\n\t\t\t\n"); printf(" MENU *******************\n"); printf('\t1. 输入学生成绩信息 input the record\n"); printf("\t2. 显示学生成绩信息 print the record\n"); printf("\t3. 显示某门课程的最高分 print the highest score \n"); printf("\t4. 显示某门课程的最低分 print the lowest score\n"); printf("\t5. 显示某门课程的平均分 print the average score\n"); printf("\t6.显示某门课的成绩 print the score from high to lov\n"); printf("\t7. 按学号查找某个学生三门课程成绩 search record on mumber\n"); printf("\t8. 按姓名查找某个学生三门课程成绩 search record onname\n"); printf("\t9. 推出 quit\n") printf("**********************************\n"); printf("\t请输入你的选择 Enter your choice (1~9):"); fflvsh(stdio); n=getchar() do {svitch(n) { case '1':input();zcd();break; case '2':print();zcd();break; case '3':Max();zcd();break; case '4':Min();zcd():break; case '5':average();zcd();break; case '6':sort();zcd();break; case '7':search_num();zcd();break; case '8';search_name();zcd();break; case '9';exit(0); /如菜单返回值为9则程序结束/ defavlt:printf("错误命令“);getchar();zcd(): } }while(1); } int max=c_scorve[0];int i; for(i=1;I<Num:i++){ if(max<c_score[i])max` #include <stdlib.h> #include <stdio.h> #include <string.h> #define NUM 2 int c_score [NUM],E_SCORE[NUM,m_score[NUM]; long xuehao[NUM]; char name[NUM]; int main() {void zcd();//申明zcd函数// system("pause"); return 0; } //输入学生学号,姓名,三门课成绩// void input() { int i; system("cls"); for(i=0;i<NUM;i==){ printf("\n请输入%d个学生的学号: ",i=1); fflush(stdin); scanf("1d',&xuehao[i]); fflush(stdin); printf("\n请输入%d个学生的姓名:",i=1); gets(name[i]); fflush(stdin); printf("\n请输入%d个学生的三门 课成绩:“,i+1); scanf("%d,%d'&c_score[i],&e_score[i],&m_score[i]); } } //输出学生信息函数// void print() { int i; printf(" 学号\t 姓名\t C语言\t 教学\n"); for(i=0;i<NUM;i++) printf (" d\t%s\t%d\t%d\t%d\n",xuehao[i],name[i],c_score[i],m_score[i]); system("pause"): } //求某门课程最高分函数,三门课选择其中一门即可 void MAX() { int
好的,下面是补全后的代码:
```c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define NUM 2
int c_score[NUM], e_score[NUM], m_score[NUM];
long xuehao[NUM];
char name[NUM];
// 申明 zcd 函数
void zcd();
// 输入学生学号,姓名,三门课成绩
void input();
// 输出学生信息函数
void print();
// 求某门课程最高分函数,三门课选择其中一门即可
void MAX();
int main() {
zcd();
return 0;
}
// 主函数界面
void zcd() {
int n = 0;
char ch;
system("cls"); // 清屏
printf("按任一键进入主菜单\n\n");
printf("\t\t皖江工学院欢迎您\n");
printf("\n\t\t----------欢迎使用简单成绩管理系统\n\t\t\t\n");
printf(" MENU *******************\n");
printf("\t1. 输入学生成绩信息 input the record\n");
printf("\t2. 显示学生成绩信息 print the record\n");
printf("\t3. 显示某门课程的最高分 print the highest score \n");
printf("\t4. 显示某门课程的最低分 print the lowest score\n");
printf("\t5. 显示某门课程的平均分 print the average score\n");
printf("\t6. 显示某门课的成绩 print the score from high to low\n");
printf("\t7. 按学号查找某个学生三门课程成绩 search record on number\n");
printf("\t8. 按姓名查找某个学生三门课程成绩 search record on name\n");
printf("\t9. 退出 quit\n");
printf("**********************************\n");
printf("\t请输入你的选择 Enter your choice (1~9):");
fflush(stdin);
ch = getchar();
do {
switch (ch) {
case '1':
input();
zcd();
break;
case '2':
print();
zcd();
break;
case '3':
MAX();
zcd();
break;
case '4':
// TODO: 补全显示某门课程的最低分函数
break;
case '5':
// TODO: 补全显示某门课程的平均分函数
break;
case '6':
// TODO: 补全显示某门课的成绩函数
break;
case '7':
// TODO: 补全按学号查找某个学生三门课程成绩函数
break;
case '8':
// TODO: 补全按姓名查找某个学生三门课程成绩函数
break;
case '9':
exit(0); // 如菜单返回值为9则程序结束
default:
printf("错误命令“");
fflush(stdin);
ch = getchar();
zcd();
}
} while(1);
}
// 输入学生学号,姓名,三门课成绩
void input() {
int i;
system("cls");
for (i = 0; i < NUM; i++) {
printf("\n请输入第%d个学生的学号: ", i + 1);
fflush(stdin);
scanf("%ld", &xuehao[i]);
fflush(stdin);
printf("\n请输入第%d个学生的姓名:", i + 1);
gets(name[i]);
printf("\n请输入第%d个学生的三门课成绩:", i + 1);
scanf("%d,%d,%d", &c_score[i], &e_score[i], &m_score[i]);
}
}
// 输出学生信息函数
void print() {
int i;
printf(" 学号\t 姓名\t C语言\t 教学\n");
for (i = 0; i < NUM; i++) {
printf("%ld\t%s\t%d\t%d\t%d\n", xuehao[i], name[i], c_score[i], e_score[i], m_score[i]);
}
system("pause");
}
// 求某门课程最高分函数,三门课选择其中一门即可
void MAX() {
int max = c_score[0];
int i;
for (i = 1; i < NUM; i++) {
if (max < c_score[i]) {
max = c_score[i];
}
}
printf("C语言最高分为:%d\n", max);
system("pause");
}
```
以上代码实现了菜单界面、输入学生成绩信息、输出学生信息、求某门课程最高分等功能,其中其他功能的实现需要您补全。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)