题目:邻接表和邻接矩阵都是图的表示方法,它们相互之间也可以通过一定的方式进行转换。本题将给出一个有向图的邻接表,请将此邻接表转换成对应的邻接矩阵。
说明:每个点由除空格外的一个可显示字符表示,点的顺序由ASCII码表的顺序决定。
输入:
输入有若干行
每行的第一个字符表示起点,随后由空格隔开的若干字符表示终点
输出:
该邻接表对应的邻接矩阵(字符在邻接表中未出现表示不含该点)
解析
需要注意的是,这里的图不一定是简单图,也就意味着,会有平行边和圈的存在,也就是说,在最终的邻接矩阵,不会是简单的01矩阵,会有大于1的数字出现。
#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int input[130][130] = { 0 };
int check[130] = { 0 };
int answer[130] = { 0 };
int main()
{
int n = 0, flag = 1;
char temp = '\0';
//这里建议用自己的办法进行读取
while ((temp = getchar()) != EOF)
{
if (temp != ' ')
{
if (flag)
{
check[temp] = 1;
n = temp;
flag = 0;
}
else
{
if (temp == '\n')
{
flag = 1;
}
else
{
input[n][temp] += 1;
check[temp] = 1;
}
}
}
}
//这里建议用自己的办法进行读取
int sum = 0;
for (int i = 0; i < 130; i++)
{
if (check[i]==1)
{
answer[sum] = i;
sum++;
}
}
for (int i = 0; i < sum; i++)
{
for (int j = 0; j < sum - 1; j++)
{
printf("%d ", input[answer[i]][answer[j]]);
}
printf("%d\n", input[answer[i]][answer[sum - 1]]);
}
return 0;
}
利用input数组来存储了输入的邻接图
这里定义的大小是130,因为我们的输入都是可以显示的字符,所以asc码是大于0,小于128的,用130就可以满足了
然后就是我对输入的时候进行的特殊处理,因为每一行的开头是起点,后面都是终点,flag等的判断,是为了对起点进行切换,来得到正确的邻接图。 (这里可以进行忽略)
利用check数组来确定哪些字符是存在的
输出的时候是按照asc码的顺序,所以根据check数组里面的顺序进行遍历就可以了
利用answer来缩小了进行存储
这里对于input数组的读取进行了忽略,请根据自己的情况和所许来编写input数组的读入,在提交的作业的时候,大家也可以避免查重的情况出现