用c语言请编写程序创建一个有向图。有向图中包含n个顶点,编号为0至n-1。 输入格式: 输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过1000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。 输出格式: 按顶点编号递增顺序输出每个顶点引出的边,每个顶点占一行,若某顶点没有引出边,则不输出。每行表示一个顶点引出的所有边,格式为a:(a,b,w)……,表示有向边a->b的权值为w,a引出的多条边按编号b的递增序排列。 输入样例: 7 7 0 1 5 0 3 7 0 6 6 1 2 4 2 5 1 3 5 3 6 5 4 输出样例 0:(0,1,5)(0,3,7)(0,6,6) 1:(1,2,4) 2:(2,5,1) 3:(3,5,3) 6:(6,5,4)
时间: 2024-03-24 19:36:58 浏览: 134
这里给出一个使用邻接表存储有向图,并按要求输出每个顶点引出的边的示例代码。其中,使用链式前向星存储边的信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 20010;
const int M = 10010;
typedef struct Edge
{
int v, w, next;
} Edge;
int n, m, head[N], idx;
Edge e[M];
void add(int u, int v, int w)
{
e[idx].v = v;
e[idx].w = w;
e[idx].next = head[u];
head[u] = idx++;
}
int cmp(const void* a, const void* b)
{
Edge* pa = (Edge*)a;
Edge* pb = (Edge*)b;
return pa->v - pb->v;
}
int main()
{
scanf("%d%d", &n, &m);
while (m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
for (int i = 0; i < n; i++)
{
if (head[i] == -1) continue;
qsort(&e[head[i]], idx - head[i], sizeof(Edge), cmp);
printf("%d:", i);
for (int j = head[i]; j != -1; j = e[j].next)
printf("(%d,%d,%d)", i, e[j].v, e[j].w);
printf("\n");
}
return 0;
}
```
阅读全文