前向星,链式前向星
2014-04-30 18:36
253 查看
很久没做图论了,基本的数据结构都有点忘了,现在复习下,继续图论
/******************************************************************/ 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; }