池子法 邻接表建图

46 篇文章 0 订阅
#include <stdio.h>
#include <cstring>
#define maxn 1000
struct edge
{
    int from,to,next,val;
} e[maxn];
int first[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        memset(first,-1,sizeof(first));
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].val);
            e[i].next=first[e[i].from];
            first[e[i].from]=i;
        }
        for(int i=1; i<10; i++)
        {
            printf("以%d为起点的边是:\n",i);
            for(int u=first[i];u!=-1;u=e[u].next)
            printf("%d %d %d\n",e[u].from,e[u].to,e[u].val);
        }
    }
    return 0;
}

一下为转载、、
#include<iostream>
  #define Maxn 200
  using namespace std;
  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体 
#include <stdio.h>
#include <cstring>
#define maxn 1000
struct edge
{
    int from,to,next,val;
} e[maxn];
int first[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        memset(first,-1,sizeof(first));
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].val);
            e[i].next=first[e[i].from];
            first[e[i].from]=i;
        }
        for(int i=1; i<10; i++)
        {
            printf("以%d为起点的边是:\n",i);
            for(int u=first[i];u!=-1;u=e[u].next)
            printf("%d %d %d\n",e[u].from,e[u].to,e[u].val);
        }
    }
    return 0;
}

一下为转载、、
#include<iostream>
  #define Maxn 200
  using namespace std;
  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体 
 int first[Maxn];//起点为下标存储(e中边的位置) 
 int main()
 {
     int edges;//边数 
     memset(first,-1,sizeof(first));
     //因为刚开始first不指向任何一条边的下标,所以first都为-1 
     cin>>edges;//边数 
     for(int i=0;i<edges;i++)
     {
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
         e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的下标 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
         直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
         */
     }
     for(int u=1;u<10;u++)//输出图 
     {
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
         for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息 
             cout<<e[v].from<<" "<<e[v].to<<" "<<e[v].weight<<endl;
     }
     return 0;
 }
 /*
 5
 3 4 6
 3 7 8
 1 3 6
 2 4 7
 3 5 1
 */</span>


 int first[Maxn];//起点为下标存储(e中边的位置) 
 int main()
 {
     int edges;//边数 
     memset(first,-1,sizeof(first));
     //因为刚开始first不指向任何一条边的下标,所以first都为-1 
     cin>>edges;//边数 
     for(int i=0;i<edges;i++)
     {
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
         e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的下标 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
         直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
         */
     }
     for(int u=1;u<10;u++)//输出图 
     {
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
         for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息 
             cout<<e[v].from<<" "<<e[v].to<<" "<<e[v].weight<<endl;
     }
     return 0;
 }
 /*
 5
 3 4 6
 3 7 8
 1 3 6
 2 4 7
 3 5 1
 */</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值