前向星,链式前向星

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

 1 /******************************************************************/
 2     Author:wangzhili
 3     title:test.c
 4     time: 2013年 12月 02日 星期一 18:07:16 CST 
 5 /******************************************************************/
 6 #include<stdio.h>
 7 #include<string.h>
13 typedef struct 
14 {
15     int from;           //记录边的起点;
16     int to;             //记录边的终点;
17     int w;              //权值;
18 }Edge;
19 Edge edge[1000];
20 int head[1000];         //记录每条边起点的位置;
21 int cmp(const void *a,const void *b)        //排序;
22 {
23     Edge p1 = *(Edge *)a;
24     Edge p2 = *(Edge *)b;
25     if(p1.from != p2.from)
26         return p1.from - p2.from;
27     return p1.to - p2.to;
28 }
29 int main()
30 {
31     int n,m,i,j;
32     while(~scanf("%d%d",&n,&m))
33     {
34         for(i = 0;i < m;i ++)
35         {
36             scanf("%d%d",&edge[i].from,&edge[i].to);
37         }
38         qsort(edge,m,sizeof(edge[0]),cmp);
39         memset(head,-1,sizeof(head));
40         head[edge[0].from] = 0;
41         for(i = 1;i < m;i ++)               //记录每条边的起点的位置;          
42         {
43             if(edge[i].from != edge[i-1].from)          
44                 head[edge[i].from] = i;
45         }
46         for(i = 1;i < m;i ++)               //从起点位置为1的边开始查起;
47         {
48             for(j = head[i];i == edge[j].from;j ++)         //如果存在起点位置为i的边,把以head[i]为起点的边全部处理完;
49                 printf("%d %d
",edge[j].from,edge[j].to);
50         }
51     }
52     return 0;
53 }
 1 /******************************************************************/
 2     Author:wangzhili
 3     title:lsqxx.c
 4     time: 2013年 12月 02日 星期一 18:07:16 CST 
 5 /******************************************************************/
 6 #include<stdio.h>
 7 #include<string.h>
 8 typedef struct
 9 {
10     int to;            //记录该条边起点指向的第一个终点;
11     int w;            //记录边的权值;
12     int next;        //记录以该边起点为起点的下一条边的位置;
13 }Edge;
14 Edge edge[1000];
15 int head[1000];        //记录起点为v的边在Edge数组中的位置;
16 int main()
17 {
18     int n,m,i,k;
19     int a,b,t;
20     while(~scanf("%d%d",&n,&m))
21     {
22         memset(head,-1,sizeof(head));
23         t = 0;
24         for(i = 1;i <= m;i ++)
25         {
26             scanf("%d%d",&a,&b);
27             edge[i].to = b;
28             edge[i].next = head[a];
29             head[a] = i;
30         }
31         for(i = 1;i <= m;i ++)
32         {
33             for(k = head[i];k != -1;k = edge[k].next)
34             {
35                 printf("%d %d
",i,edge[k].to);
36             }
37         }
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3454490.html