图的创建和遍历

孤勇者探险(图的遍历)

作者 YJ

单位 西南石油大学

一款名为"孤勇者探险"的游戏,游戏中共有若干个小岛,每个岛上均有怪兽,闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分(每个岛的积分根据难度可能不相同),编写程序求出最终闯关成功者(闯过所有小岛)共获得多少积分,并给出对应的闯关行进路线。

思路提示:

游戏地图可抽象为图结构,且一定为连通图,例如:

图中顶点的值则为每个小岛对应的积分,'0'小岛为起点,从0号开始遍历,将各个顶点的值累加则为最终获得得分,同时输出遍历序列,则为对应的闯关行进路线。

函数接口定义:

cpp 复制代码
void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储
int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为函数返回值

裁判测试程序样例:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100

int visited[MVNum];

typedef struct{
    int vexs[MVNum];        //顶点向量,各小岛对应积分
    int arcs[MVNum][MVNum]; //邻接矩阵
    int vexnum,arcnum;      //顶点数,边数
}AMGraph;
int LocateVex(AMGraph G,int u)   //查询顶点u的下标
 {
   int i;
   for(i=0;i<G.vexnum;++i)
 if(   u==G.vexs[i]     )       return i;
   return -1;
 }
void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储
int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为返回值
int main(){
    AMGraph G;
    int i;
    CreateUDG(G);
    i=LocateVex(G,0);  //找到起点下标
    if(i>=0)
      printf("\n%d",DFS(G,i));
    return 0;
}


/* 请在这里填写答案 */

输入格式:

第1行依次输入各个小岛对应得分(整数),即顶点的值,以-1结束(顶点不包含-1)

接下来若干行输入每条边的信息,格式为:v1空格v2(v1、v2为小岛对应的下标),直到输入'-1 -1'结束。

输出格式:

输出两行数据,第一行为行进路线,以小岛的积分(即顶点的值)作为小岛标识,每个标识之间间隔一个空格,第二行为一个整数,为最终获得积分,无换行。

输入样例:

复制代码
0 1 2 3 4 5 6 -1
0 3
0 4
3 2
3 1
2 5
1 5
4 5
5 6
-1 -1

输出样例:

复制代码
0 3 1 5 2 4 6 
21
cpp 复制代码
void CreateUDG(AMGraph &G)
{
    int i=0;
    int j;
    scanf("%d",&G.vexs[i]);
    G.vexnum=0;
    while(G.vexs[i]!=-1)
    {
        i++;
		scanf("%d",&G.vexs[i]);
        G.vexnum++;
    }
    for(i=0;i<G.vexnum ;i++)
    {
        for(j=0;j<G.vexnum;j++)
        {
            G.arcs[i][j]=0;
        }
    }
    int v1,v2;
    G.arcnum=0;
    scanf("%d %d",&v1,&v2);
    while((v1 != -1) && (v2 != -1))
    {
        G.arcs[v1][v2]=1;
        G.arcs[v2][v1]=G.arcs[v1][v2];
        G.arcnum++;
        scanf("%d %d",&v1,&v2);
    }
}
int DFS(AMGraph G, int v)
{
    int cnt=0;
    printf("%d ",G.vexs[v]);
    cnt+=G.vexs[v];
    visited[v]=1;
    int i;
    int k=0;
    for(i=0;i<G.vexnum;i++)
    {
        if((G.arcs[v][i]!=0) && (!visited[i]))
        {
            k=DFS(G,i);
            cnt+=k;
        }
    }
    return cnt;
}

图的创建和遍历一定要注意把顶点下标和顶点的值区分开。

相关推荐
小李小李快乐不已1 分钟前
二叉树理论基础
数据结构·c++·算法·leetcode
仰泳的熊猫6 分钟前
1149 Dangerous Goods Packaging
数据结构·c++·算法·pat考试
_OP_CHEN12 分钟前
【算法基础篇】(三十七)图论基础之多源最短路:Floyd 算法吃透所有点对最短路径!
算法·蓝桥杯·图论·算法竞赛·floyd算法·acm/icpc·多源最短路
Web极客码12 分钟前
如何选择最适合的内容管理系统(CMS)?
java·数据库·算法
程序员三明治19 分钟前
【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣
算法·leetcode·动态规划·java后端·01背包·完全背包·零钱兑换
自由生长202420 分钟前
大数据计算框架-流式计算的Join
算法
IT猿手21 分钟前
融合DWA的青蒿素优化算法(Artemisinin Optimization Algorithm, AOA)求解无人机三维动态避障路径规划,MATLAB代码
算法·matlab·无人机
H_z___23 分钟前
Codeforces Global Round 31 (Div. 1 + Div. 2) A ~ E
数据结构·算法
小龙报26 分钟前
【算法通关指南:算法基础篇 】双指针专题:1.唯一的雪花 2.逛画展 3.字符串 4.丢手绢
c语言·数据结构·c++·人工智能·深度学习·算法·信息与通信
superman超哥9 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉