您的位置:首页 > 其它

前向星,链式前向星

2013-12-02 18:36 211 查看
很久没做图论了,基本的数据结构都有点忘了,现在复习下,继续图论

/******************************************************************/
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: