#includestdio.h
int main
string.h
两个程序都要吗?
第一个代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct E { //定义顶点信息
int weight; //权重
int vt2; //顶点编号
struct E* next; //该顶点连接的下一个顶点(终点)
}*edge;
int main(int argc, char const* argv[])
{
int v, e, dele;
int v1, v2, w;
edge temp;
scanf("%d %d", &v, &e); //输入顶点个数 和边的个数
edge* map = (edge*)malloc(v * sizeof(edge)); //申请内存空间,保存所有顶点的信息(动态结构体数组)
for (int i = 0; i < v; i++) { //初始化所有顶点信息
//map[i] = (edge)malloc(sizeof(struct E)); //这一句不需要了,上面的mpa已经申请了足够的内存
map[i]->vt2 = i; //设置顶点编号
map[i]->weight = 0; //初始化顶点权重
map[i]->next = NULL; //初始化该顶点的下一个顶点,这里是通过链表的方式保存以i顶点为顶点的所有边
}
for (int j = 0; j < e; j++) { //输入所有边的信息
scanf("%d %d %d", &v1, &v2, &w); //输入起点、终点、权重
edge medge = (edge)malloc(sizeof(struct E)); //申请内存空间,保存每条边的信息
medge->vt2 = v2; medge->weight = w; medge->next = NULL; //用输入信息设置边的属性
edge ptr = map[v1]; //找到以v1为起点的顶点,将medge插入
//插入排序,根据终点的大小,将这条边插入以v1为起点的边的链表中
while (ptr->next && ptr->next->vt2 < v2) { //这里就是遍历链表,找到medge节点插入的位置(根据终点编号从小到大排序)
ptr = ptr->next;
}
temp = ptr->next; ptr->next = medge; medge->next = temp; //将medge节点插入链表
} //将边按大小顺序插入到邻接表中
scanf("%d", &dele); //读取需要删除的边的个数
for (int k = 0; k < dele; k++) { //读取所有需要删除的边
scanf("%d %d", &v1, &v2); //读取需要删除的边的起点和终点
edge ptr = map[v1]; //找到以v1为起点的所有边的链表
//下面的代码块是找到以v2为终点的边,将其从链表中删除
while (ptr->next && ptr->next->vt2 != v2) ptr = ptr->next; //这里就是遍历链表,找到以v2为终点的节点
temp = ptr->next; ptr->next = ptr->next->next; free(temp); //将找到的节点从链表中删除
}
edge ptr;
for (int m = 0; m < v; m++) { //遍历所有顶点
if (map[m]->next) printf("%d:", m); //如果m顶点有边,输出顶点编号
ptr = map[m]->next; //得到以m为起点的所有边的链表
while (ptr) { //遍历链表
printf("(%d,%d,%d)", m, ptr->vt2, ptr->weight); //输出起点、终点和权重
ptr = ptr->next; //链表节点后移,以便实现对链表的遍历
}
if (map[m]->next && m != v - 1)printf("\n"); //如果不是最后一个顶点,且存在以该顶点为起点的边,输出换行符
}
return 0;
}
第二段代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//建立表头结点表
vector<int> adjacency[20000]; //声明数组,数组的每个元素都是vector<int>容器,用于存储以i为起点的所有的边(i是数组的下标索引,与顶点编号一致)
int book[20000] ={0}; //这里是存储深度,这里最好初始化为0,否则再部分编译器中会出错
void dfs(int cur) {
cout << cur << " "; //输出顶点编号
book[cur] = 1; //深度设置为1
//遍历链表中的结点
int length = adjacency[cur].size(); //得到以cur为起点的边的个数
for (int i = 0; i < length; i++) { //遍历这些边
if (book[adjacency[cur][i]] == 0) { //如果该边的终点的深度为0(也就是没有计算深度),则输出该终点的深度
dfs(adjacency[cur][i]); //输出该节点的深度
}
}
}
int main() {
int vertex, edge, vertex1, vertex2;
cin >> vertex >> edge; //输入顶点和边的个数
//输入边
for (int i = 0; i < edge; i++) { //输入所有边的信息
cin >> vertex1 >> vertex2; //输入起点、终点
adjacency[vertex1].push_back(vertex2); //adjacency[vertex1]是以vertex1为起点的vector容器,把vertex2插入该容器,也就是把这条边放入以vertex1为起点的边的容器中
}
//给邻接表的每个链表的结点排序
for (int i = 0; i < vertex; i++) { //对所有的顶点的容器进行排序,每个顶点的容器单独排序(也就是对以i为起点的所有的边进行排序)
sort(adjacency[i].begin(), adjacency[i].end());//对以i为起点的所有的边进行排序
}
//遍历每个结点
for (int i = 0; i < vertex; i++) { //遍历所有节点
if (book[i] == 0) { //如果该节点还没有进行检查深度,则进行深度检查
dfs(i); //调用dfs进行深度检查
}
}
return 0;
}
第一个程序看了一半,漏洞百出
这程序能运行?
一开始建立map为什么是个数组,这一开始就应该建立链表才对
ptr->next永远都是NULL,根本没有赋值过