建邻接表的两种方式

来源:互联网 发布:vs运行c语言 编辑:程序博客网 时间:2024/05/19 13:46

/* *  构建邻接表模板 * */  #include<stdio.h>  #include<string.h>  int head[100100];//表头,head[i]代表起点是i的边的编号  int cnt;//代表边的编号  struct s  {      int u;//记录边的起点      int v;//记录边的终点      int w;//记录边的权值      int next;//指向上一条边的编号  }edge[100010];  void add(int u,int v,int w)//向所要连接的表中加入边  {      edge[cnt].u=u;      edge[cnt].v=v;      edge[cnt].w=w;      edge[cnt].next=head[u];      head[u]=cnt++;  }  int main()  {      int n;      while(scanf("%d",&n)!=EOF)      {          int i;          cnt=0;          memset(head,-1,sizeof(head));//清空表头数组          for(i=0;i<n;i++)          {              int u,v,w;              scanf("%d%d%d",&u,&v,&w);              add(u,v,w);          }          int u,v,w;          scanf("%d",&u);          for(i=head[u];i!=-1;i=edge[i].next)//输出所有与起点为u相连的边的终点和权值          {               v=edge[i].v;               w=edge[i].w;               printf("%d %d\n",v,w);          }      }      return 0;  }   

#include<stdio.h>    #include<vector>    using namespace std;    #define SIZE 1000    vector<int> adj[SIZE]; int n,m;    void init()    {    scanf("%d%d",&n,&m);     int i,j;    int a,b;    for(i=1;i<=n;i++)    {    adj[i].clear(); //清除     }    for(i=1;i<=m;i++)    {    scanf("%d%d",&a,&b);    adj[a].push_back(b);    adj[b].push_back(a);     }    }    void print()    {    int i;    int j;     for(i=1;i<=n;i++)    {     printf("dian %d:",i);    for(j=0;j<adj[i].size();j++)    {    printf("%d ",adj[i][j]);     }     printf("\n");    }    }    int main()    {    int t;    scanf("%d",&t);    while(t--)    {     init();     print();    }     return 0;     }

0 0
原创粉丝点击