const int MAX_N = 200; //最大顶点数
const int MAX_M = 2e5; //最大边数
//___________链式前向星___________
typedef struct E{
int v;//这条边指向的终点
int nxt;//跳转到相关的下一条边(下面会说)
int w;//这条边的权值
}E;//存边的结构体
E edge[MAX_M];//存边数组
int head[MAX_N];//下面会说
int cnt = 0;//边的编号,下面会说
//初始化函数
void init()
{
memset(head,-1,sizeof(head));//将head数组的值全置为-1.
cnt = 0;//初始化边的编号
}
void add(int u,int v,int w)//u起点,v终点,w权值
{
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
const int MAX_N = 200;//最大节点个数
const int MAX_M = 2e5;//完全图的边数为n*(n-1)/2,即n^2级别
typedef struct Node{
int v;//终点编号
int w;//起点到终点的边权
}Node;
//___________链式前向星___________
typedef struct TT{int v,nxt,w;}E;
E edge[MAX_M];
int head[MAX_N];
int cnt = 0;
//初始化函数
void init(){
memset(head,-1,sizeof(head));
cnt = 0;
memset(edge,0,sizeof(edge));//这一句写不写都无所谓
}
//加边
inline void add(int u,int v,int w)
{
edge[++cnt].v = v;//注意这里是++cnt
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
//建图
void get_map(int m)
{
printf("请输入边的起点 终点 权值:\n");
for(int i = 1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
//add(v,u,w); //如果是无向图,加上这一句,即反过去加一条边
}
}
//输出图
void print_map(int n){
//以顶点形式遍历边
for(int i = 1;i<=n;i++){
printf("起点%c:",i+'A'-1);
//以下是遍历某一个顶点的所有边,e代表边的编号,~e等同于e!=-1
for(int e = head[i];~e;e = edge[e].nxt){
int v = edge[e].v;
int w = edge[e].w;
printf("\t边编号:%d,终点:%c,权值:%d",e,v+'A'-1,w);
}
printf("\n");
}
}
int main(){
int n,m;
init();//记得初始化
printf("请输入顶点个数,边个数:\n");
scanf("%d %d",&n,&m);
//建图
get_map(m);
//输出图
print_map(n);
return 0;
}
//测试数据
/*
5 9
1 2 10
1 3 20
3 5 30
4 5 90
2 4 80
1 5 40
2 3 50
1 4 60
2 5 70
*/