链式前向星(模板)

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
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值