很久没做图论了,基本的数据结构都有点忘了,现在复习下,继续图论
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 }