前向星,链式前向星

来源:互联网 发布:虚拟机nat网络配置 编辑:程序博客网 时间:2024/04/28 10:50

很久没做图论了,基本的数据结构都有点忘了,现在复习下,继续图论


/******************************************************************/    Author:wangzhili    title:test.c    time: 2013年 12月 02日 星期一 18:07:16 CST /******************************************************************/#include<stdio.h>#include<string.h>typedef struct {    int from;           //记录边的起点;    int to;             //记录边的终点;    int w;              //权值;}Edge;Edge edge[1000];int head[1000];         //记录每条边起点的位置;int cmp(const void *a,const void *b)        //排序;{    Edge p1 = *(Edge *)a;    Edge p2 = *(Edge *)b;    if(p1.from != p2.from)        return p1.from - p2.from;    return p1.to - p2.to;}int main(){    int n,m,i,j;    while(~scanf("%d%d",&n,&m))    {        for(i = 0;i < m;i ++)        {            scanf("%d%d",&edge[i].from,&edge[i].to);        }        qsort(edge,m,sizeof(edge[0]),cmp);        memset(head,-1,sizeof(head));        head[edge[0].from] = 0;        for(i = 1;i < m;i ++)               //记录每条边的起点的位置;                  {            if(edge[i].from != edge[i-1].from)                          head[edge[i].from] = i;        }        for(i = 1;i < m;i ++)               //从起点位置为1的边开始查起;        {            for(j = head[i];i == edge[j].from;j ++)         //如果存在起点位置为i的边,把以head[i]为起点的边全部处理完;                printf("%d %d\n",edge[j].from,edge[j].to);        }    }    return 0;}

/******************************************************************/    Author:wangzhili    title:lsqxx.c    time: 2013年 12月 02日 星期一 18:07:16 CST /******************************************************************/#include<stdio.h>#include<string.h>typedef struct{    int to;            //记录该条边起点指向的第一个终点;    int w;            //记录边的权值;    int next;        //记录以该边起点为起点的下一条边的位置;}Edge;Edge edge[1000];int head[1000];        //记录起点为v的边在Edge数组中的位置;int main(){    int n,m,i,k;    int a,b,t;    while(~scanf("%d%d",&n,&m))    {        memset(head,-1,sizeof(head));        t = 0;        for(i = 1;i <= m;i ++)        {            scanf("%d%d",&a,&b);            edge[i].to = b;            edge[i].next = head[a];            head[a] = i;        }        for(i = 1;i <= m;i ++)        {            for(k = head[i];k != -1;k = edge[k].next)            {                printf("%d %d\n",i,edge[k].to);            }        }    }    return 0;}


0 0