您的位置:首页 > 其它

初学邻接表

2015-08-04 15:06 176 查看
据说邻接表在图论中用的比较多

//例如输入3  1 2 10;1 3 20;1 4 30; 会输出4 30;3 20;2 10;
//输入1 2 10时,edge[0].u=1,edge[0].v=2,edge[0].w=10,edge[0].next=-1;此时head[1]=0,cnt=1;
//就是这里,输入1 3 20时,egde[1].u=1,egde[1].v=3,edge[1].w=20,edge[1].next=0;此时head[1]=1,cnt=2;
//edge[].next指向的是前一个,相当于链表里的指针的作用
#include<cstdio>
#include<cstring>
int head[1010];
int cnt;
struct node
{
int u,v,w,next;
}edge[1010];
void add(int u,int v,int w)//添加相连边,u为原始点,v为与u相连的点,w为权值
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];//这里指向上一个,查找的时候用到
head[u]=cnt;//上午大神的代码是head[u]=cnt++原来是先赋值再自增,我这渣渣。。。
cnt++;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(head,-1,sizeof(head));//head数组初始化为-1
cnt=0;//cnt初始化为0 从0开始放
int u,v,w;
while(n--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
scanf("%d",&u);
for(int i=head[u];i!=-1;i=edge[i].next)//查找所有与u相连的边
{//从后往前查找
int v=edge[i].v;
int w=edge[i].w;
printf("%d %d\n",v,w);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: