【洛谷B3643】图的存储 解题报告

洛谷B3643 - 图的存储

题目描述

给定一个 n n n 个顶点 m m m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。

输入格式

第一行输入两个正整数 n n n m m m,表示图的顶点数和边数。

第二行开始,往后 m m m 行,每行输入两个以空格隔开的正整数 u , v u,v u,v,表示 u , v u,v u,v 顶点之间有一条边直接相连。

输出格式

首先输出 n n n n n n 列的矩阵,以空格隔开每一行之间的数表示邻接矩阵。第 i i i 行第 j j j 列的数为 1 1 1 则表示顶点 i , j i,j i,j 之间有一条边直接相连;若为 0 0 0 则表示没有直接相连的边。

再往后输出 n n n 行。第 i i i 行首先先输出一个整数 d i d_i di,表示这个顶点的度数,再按照从小到大的顺序,依次输出与顶点 i i i 直接相连的所有顶点。

样例 #1

样例输入 #1

5 5
1 2
2 3
3 5
1 3
3 4

样例输出 #1

0 1 1 0 0
1 0 1 0 0
1 1 0 1 1
0 0 1 0 0
0 0 1 0 0
2 2 3
2 1 3
4 1 2 4 5
1 3
1 3

提示

样例的图如图所示:

数据保证,对于所有数据, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1m105,且图无重边无自环。


拿到这题,我本来想快刀斩乱麻直接套模板做,结果老老实实打了很久图的邻接矩阵存储和邻接表存储,最后过了样例但是全 W A WA WA,给我气晕了。各种抠细节之后,也只对了三个点,麻了。
(洛谷的 B B B题库不给看样例,标程也不给看代码的,因为要卖课……)

知识点链接:图的存储与基本操作

总之先放出这段代码吧,希望有缘人看到能指点一下我。

2024 / 06 / 01 3 : 50 : 49 2024/06/01\ 3:50:49 2024/06/01 3:50:49更新:三点半的时候灵机一动想到了怎么改代码,已经AC。错误代码放在这里警示后人,更正的满分代码放在文末。

以下是30pts的代码:

//30pts(WA)
#define _CRT_SECURE_NO_WARNINGS 1
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;#define MaxVertexNum 1007
#define MaxMGSize 500007
typedef char VertexType;
typedef int EdgeType;/*
typedef struct {VertexType Vex[MaxVertexNum];EdgeType Edge[MaxVertexNum][MaxVertexNum];
}MGraph;
*/typedef struct ArcNode {int adjvex;struct ArcNode* nextarc;
}ArcNode,* ArcList;
typedef struct VNode {VertexType data;ArcNode* firstarc;
}VNode, AdjList[MaxVertexNum];
typedef struct {AdjList vertices;
}ALGraph;int vexnum, arcnum;
int MGraph[MaxMGSize] = { 0 };inline void Init(ALGraph &G) {
//	memset(MGraph, 0, sizeof(MGraph));for (int i = 1; i <= vexnum; ++i) {ArcList h = (ArcList)malloc(sizeof(ArcList));h->adjvex = 0;h->nextarc = NULL;G.vertices[i].data = 0;G.vertices[i].firstarc = h;}return;
}inline int Get_K(int i, int j) {if (i < j)swap(i, j);return i * (i - 1) / 2 + j - 1;//对称矩阵压缩存储(下三角)
}inline void MG_Insert(int i, int j) {if (i < j)swap(i, j);MGraph[Get_K(i, j)] = 1;return;
}inline void MG_Print() {for (int i = 1; i <= vexnum; ++i) {for (int j = 1; j <= vexnum; ++j) {printf("%d", MGraph[Get_K(i, j)]);if (j != vexnum)printf(" ");}printf("\n");}return;
}inline void AG_Insert(ALGraph& G, int i, int j) {ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->nextarc = NULL;G.vertices[i].data++;ArcNode* head = G.vertices[i].firstarc;ArcNode* tail = G.vertices[i].firstarc->nextarc;if (tail == NULL) {G.vertices[i].firstarc->nextarc = p;}else {while (tail != NULL) {if (tail->adjvex > p->adjvex) {p->nextarc = tail;head->nextarc = p;break;}else {head = head->nextarc;tail = tail->nextarc;continue;}}if (tail == NULL)head->nextarc = p;}ArcNode* q = (ArcNode*)malloc(sizeof(ArcNode));q->adjvex = i;q->nextarc = NULL;G.vertices[j].data++;head = G.vertices[j].firstarc;tail = G.vertices[j].firstarc->nextarc;if (tail == NULL) {G.vertices[j].firstarc->nextarc = q;}else {while (tail != NULL) {if (tail->adjvex > q->adjvex) {q->nextarc = tail;head->nextarc = q;break;}else {head = head->nextarc;tail = tail->nextarc;continue;}}if (tail == NULL)head->nextarc = q;}return;
}inline void AG_Print(ALGraph& G) {for (int i = 1; i <= vexnum; ++i) {if (!G.vertices[i].data) {printf("0\n");continue;}printf("%d ", G.vertices[i].data);ArcList Arc = G.vertices[i].firstarc->nextarc;while (Arc != NULL) {printf("%d", Arc->adjvex);Arc = Arc->nextarc;if (Arc != NULL)printf(" ");}printf("\n");}return;
}int main() {ALGraph Ag;int i, j;scanf("%d %d", &vexnum, &arcnum);Init(Ag);for (int k = 1; k <= arcnum; ++k) {scanf("%d %d", &i, &j);MG_Insert(i, j);AG_Insert(Ag, i, j);}MG_Print();AG_Print(Ag);return 0;
}

反复修改调试后都没能解决这题,甚至我自己造了几个数据,还是不行,明明输出看起来没有任何问题,也许是 s c a n f scanf scanf p r i n t f printf printf的问题吧,以前打 O I OI OI的时候也经常遇到各种玄学问题。(其实结构体定义里就出了问题
总之之后我就急了,直接花不到十分钟打了个暴力程序,然后 A C AC AC。思路很简单,用bool类型存邻接矩阵,输出的时候直接遍历就完事了。输出邻接表时多遍历一次统计信息即可。
男人,哈哈哈,什么罐头我说,曼巴出去。
以下是100pts的代码:

//AC
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;int n, m;
bool g[1001][1001];int main() {memset(g, false, sizeof(g));cin >> n >> m;int u, v;for (int i = 1; i <= m; ++i) {cin >> u >> v;g[u][v] = true, g[v][u] = true;}for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (g[i][j])cout << "1";else cout << "0";if (j != n)cout << " ";}cout << endl;}for (int i = 1; i <= n; ++i) {int ans = 0;for (int j = 1; j <= n; ++j)if (g[i][j])ans++;if (!ans)cout << ans;else {cout << ans << " ";for (int j = 1; j <= n; ++j)if (g[i][j])cout << j << " ";}cout << endl;}return 0;
}

但是!!

我凌晨写日记复盘今天的时候,突然想到了这题要怎么改。首先把所有的 s c a n f scanf scanf p r i n t f printf printf换回了 c i n cin cin c o u t cout cout的输入输出流,然后再通读了一下代码,发现一个致命错误——

typedef struct VNode {VertexType data;//问题行ArcNode* firstarc;
}VNode, AdjList[MaxVertexNum];

我怎么也没想到是结构体里面出了问题,本题中我使用了顶点结点的 d a t a data data域记录每个顶点的度,但是偷懒直接用了自己之前写的模板,导致 d a t a data data的数据类型实际上是 c h a r char char,而非 i n t int int,属实是低级错误了。所以能过三个点真的是运气好吧。(警钟撅烂
改完代码后再对代码整体进行了一点优化,提交,一遍 A C AC AC,完美。
以下是100pts的代码:(无需开启 O 2 O2 O2加速)

//AC 100pts
#define _CRT_SECURE_NO_WARNINGS 1
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;#define MaxVertexNum 1007
#define MaxMGSize 500007/*
typedef char VertexType;
typedef int EdgeType;
typedef struct {VertexType Vex[MaxVertexNum];EdgeType Edge[MaxVertexNum][MaxVertexNum];
}MGraph;
*/typedef struct ArcNode {int adjvex;struct ArcNode* nextarc;
}ArcNode,* ArcList;
typedef struct VNode {int data;//已更正data的数据类型ArcNode* firstarc;
}VNode, AdjList[MaxVertexNum];
typedef struct {AdjList vertices;
}ALGraph;int vexnum, arcnum;
int MGraph[MaxMGSize] = { 0 };inline void Init(ALGraph &G) {
//	memset(MGraph, 0, sizeof(MGraph));for (int i = 1; i <= vexnum; ++i) {ArcList h = (ArcList)malloc(sizeof(ArcList));h->adjvex = 0;h->nextarc = NULL;G.vertices[i].data = 0;G.vertices[i].firstarc = h;}return;
}inline int Get_K(int i, int j) {if (i < j)swap(i, j);return i * (i - 1) / 2 + j - 1;//对称矩阵压缩存储(下三角)
}inline void MG_Insert(int i, int j) {if (i < j)swap(i, j);MGraph[Get_K(i, j)] = 1;return;
}inline void MG_Print() {for (int i = 1; i <= vexnum; ++i) {for (int j = 1; j <= vexnum; ++j) {cout << MGraph[Get_K(i, j)];if (j != vexnum)cout << " ";}cout << endl;}return;
}inline void AG_Insert(ALGraph& G, int i, int j) {//简化了邻接表的插入函数ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->nextarc = NULL;G.vertices[i].data++;ArcNode* head = G.vertices[i].firstarc;ArcNode* tail = G.vertices[i].firstarc->nextarc;if (tail == NULL) {G.vertices[i].firstarc->nextarc = p;}else {while (tail != NULL) {if (tail->adjvex > p->adjvex) {p->nextarc = tail;head->nextarc = p;break;}else {head = head->nextarc;tail = tail->nextarc;continue;}}if (tail == NULL)head->nextarc = p;}return;
}inline void AG_Print(ALGraph& G) {//改用了更简洁的cin,cout流for (int i = 1; i <= vexnum; ++i) {if (!G.vertices[i].data) {cout << "0" << endl;continue;}cout << G.vertices[i].data << " ";ArcNode* Arc = G.vertices[i].firstarc->nextarc;while (Arc != NULL) {cout << Arc->adjvex;Arc = Arc->nextarc;if (Arc != NULL)cout << " ";}cout << endl;}return;
}int main() {ALGraph Ag;int i, j;cin >> vexnum >> arcnum;Init(Ag);for (int k = 1; k <= arcnum; ++k) {cin >> i >> j;MG_Insert(i, j);AG_Insert(Ag, i, j);AG_Insert(Ag, j, i);}MG_Print();AG_Print(Ag);return 0;
}

但!是! 我还是不能接受暴力碾压标程,虽说直接开 b o o l bool bool也不能算完全暴力吧……
我有意见

完整代码也可参看我的Github:标准模板写法传送门,暴力写法传送门


令人感叹,暴力代码 A C AC AC,标准模板代码 WA A C AC AC但是更慢 ,这就是 O I OI OI的魅力啊!(大嘘
以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要&#xff0c;要在服务器上使用Jenkins完成Android项目的自动化构建&#xff0c;但服务器上登录的账户没有管理员权限&#xff0c;无法用sudo命令&#xff0c;因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

【Python】解决Python报错:AttributeError: ‘function‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

未来已来, AI将作为超级工具?

人工智能时代已来 1.AI将作为超级工具&#xff1a;AI是推动全产业数字化转型的高效工具&#xff0c;机遇比互联网时代大10倍&#xff0c;但只有1/3的机会留给初创企业。 2.硅谷AI市场分类中&#xff0c;特别看好开源平台&#xff0c;其将为初创企业和大企业提供更多选择。 3.…

C# 字节数组(byte[])拼接的性能对比测试

将C#中的三种字节数组拼接方式的性能做了一个对比测试&#xff0c;DEMO程序代码如下&#xff1a; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Byte数组拼接测…

使用 DuckDuckGo API 实现多种搜索功能

在日常生活中&#xff0c;我经常使用搜索引擎来查找信息&#xff0c;如谷歌和百度。然而&#xff0c;当我想通过 API 来实现这一功能时&#xff0c;会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容&#xff0c;并…

Gbase 国产数据库

参考&#xff1a;参考&#xff1a; 5分钟学会Linux环境GBase 8t安装和部署 - 光洋山 - twt企业IT交流平台 (talkwithtrend.com)https://www.talkwithtrend.com/Article/197237 视频 GBase 8s快速入门-功能简介与演示-大数据教程-腾讯课堂 (qq.com)https://ke.qq.com/course/…

ADB日常使用命令

【ADB全称 Android Debug Bridge】 是Android SDK中的一个命令行工具adb命令可以直接操作管理Android模拟器或真实的Android设备&#xff08;手机&#xff09; 建立PC和模拟器连接 # 建立连接 adb connect 127.0.1: 模拟器端口号〈逍遥模拟器21503〉 # 验证是否连接成功 adb d…

整数乘除法练习题

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #include<Windows.h>void show1(); .//开始界面 int getchoice(); //选择界面 int dowork(int n); //随机做乘除法 int num(); //用户确定做题的数量 v…

OrangePi AIpro 变身 Android 打包机

主板基本信息介绍 OrangePi AIpro&#xff0c;是香橙派联合华为精心打造&#xff0c;建设人工智能新生态而设计的一款开发板&#xff0c;这次为大家分享下我上手的这款 OrangePi AIpro 8GB&#xff08;算力达8TOPS&#xff09; 的一些小小的经验。 基本参数如下&#xff1a; …

首创十八道工艺,口味王引领槟榔产业高质量发展

说到槟榔&#xff0c;相信大伙都不会陌生&#xff0c;槟榔的历史可以追溯到汉代&#xff0c;不少文献有过记载&#xff0c;如汉代的沈约著的《咏竹槟榔盘》中提到“荐羞虽百品&#xff0c;所贵浮天实”&#xff1b;唐朝“诗仙”李白更是写道“何时黄金盘&#xff0c;一斛荐槟榔…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

buuctf的RSA(五)

[RoarCTF2019]RSA 一看到题目&#xff0c;我就有些蒙了&#xff0c;A是代表了什么&#xff0c; 先来分解n 接下来可以暴力破解e了&#xff0c;因为e没有给出来&#xff0c;应该不会太大&#xff0c;猜测是四位数字 import gmpy2 import libnum from Crypto.Util.number import…

网卡配置基础知识

1、网络设置方式 首先科普下Virtual Box虚拟机的几种主流的网络设置方式&#xff0c;官方文档&#xff1a; 2解释 Host-only&#xff1a;仅主机模式 虚拟机和宿主机、虚拟机之间能互通&#xff0c;但是不能访问外网&#xff0c;虚拟机和宿主机同网段的其他主机不能互通这种…

数据结构---栈队列

栈和队列是我们数据结构中经常使用的数据结构&#xff0c;所以现在来了解一下栈和队列。 栈 特点&#xff1a; 栈是一种特殊的线性表&#xff0c;其中进行数据插入和弹出的部分叫做栈顶&#xff0c;另一端叫做栈底。 只允许数据从栈顶压入&#xff0c;从栈顶弹出即先进后出的…

最佳实践:REST API 的 HTTP 请求参数

HTTP 请求中的请求参数解释 当客户端发起 HTTP 请求 时&#xff0c;它们可以在 URL 末尾添加请求参数&#xff08;也叫查询参数或 URL 参数&#xff09;来传递数据。这些参数以键值对的形式出现在 URL 中&#xff0c;方便浏览和操作。 请求参数示例 以下是一些带有请求参数的…

JS-Lodash工具库

文档&#xff1a;Lodash Documentation orderBy函数&#xff1a;根据条件进行排序 注&#xff1a;第一个是要排序的数组&#xff0c;第二个是根据什么字段进行排序&#xff0c;第三个是排序的方式&#xff08;desc倒序&#xff09; 安装方式&#xff1a;Lodash npm i lodash…

小型企业网络组网与配置仿真实验

实验要求如下: 我这里以学号46为例 一、IP 地址规划表 &#xff08;一&#xff09;主类网络 &#xff08;二&#xff09;子网划分 需要自己计算有效ip范围 在C类主网络192.168.46.0/24中&#xff0c;我们需要先了解这个网络的子网掩码为255.255.255.0&#xff0c;其二进制…

『ZJUBCA MeetUP』 5月25日线下活动——Aptos 链的动态与应用

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/05/25 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

TPM之VMK密封

本篇文章主要介绍基于TPM的Bitlocker全盘加密时&#xff0c;VMK密钥的密封&#xff08;Seal&#xff09;流程&#xff0c;至于TPM、Bitlocker、密钥保护器、VMK密钥等这些东西是什么&#xff0c;这里不做解释&#xff0c;需要自己脑补一下&#xff08;╮(╯▽╰)╭&#xff09;…

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境&#xff1a;PHPMYSQL 下载源码地址&#xff1a;极速云