前向星,链式前向星

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


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


posted on 2014-04-30 18:36  wangzhili  阅读(124)  评论(0编辑  收藏  举报