zoukankan      html  css  js  c++  java
  • 链式前向星

    在了解什么是链式前向星之前,我们先来看一下什么是前向星。


    前向星其实就是一种边集数组。我们先把每条边的起点按照从小到大的顺序排序如果起点一样,那么就按照终点从小到达来排序。并记录下以某个点为起点的所有边在数组中的起始位置和边的数量,那么前向星就构造好了。

    利用前向星,我们可以在O(1)的时间内找到以i为起点的第一条边以O(len[i])的时间找到以i为起点的所有边。前向星特别适合用
    来优化SPFA(一种最短路算法),DFS以及BFS(深度优先搜索和宽度优先搜索)。

    但是前向星还是需要加上排序的时间的,如果是快排大概是O(n*log(n)); 而链式前向星则不需要排序也能够得到。
    我们用head[i]表示以i为起点的最后一条边的储存位置,next[i]表示与第i条边同起点的上一条边的储存位置,e[i]表示第i条边的终点。

    加边:

    struct Edge
    {
    int next ;
    int e;
    int w;
    } edge [ MAXN ];

    edge[i].next表示同起点的下一条边,edge[i].e代表这条边的终点,edge[i].w为权值。

    void add (int u,int v,int w)
    {
    edge [cnt ].w = w;
    edge [cnt ].e = v;
    edge [cnt ].next = head [u];
    head [u] = cnt ++;
    }

    cnt初始化为一,head数组初始化为0.

    完整代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    #define MAXN 100000
    struct EDGE
    {
    	int next;//同起点的上一条边的位置 
    	int e;//边的终点 
    	int w;//权值 
    }edge[MAXN];
    int cnt=1;
    int head[MAXN];//以i为起点的最后一条边 
    void add(int u,int v,int w)
    {
    	edge[cnt].w=w;
    	edge[cnt].e=v;
    	edge[cnt].next=head[u];
    	head[u]=cnt++;
    }
    int main()
    {
    	memset(head,0,sizeof(head));
    	int a,b,n,c;
    	cin>>n;//输入边的数量 
    	while(n--)
    	{
    		cin>>a>>b>>c;
    		add(a,b,c);
    	}
    	cout<<"请输入要查询的边的起点:";
    	int i;//要查询的边
    	cin>>i;
    	for(int j=head[i];j!=0;j=edge[j].next)
    	{
    		cout<<i<<"->"<<edge[j].e<<endl;	
    	} 
    	return 0;
    } 
  • 相关阅读:
    vb动态创建控件
    100多个很有用的JavaScript函数以及基础写法汇总
    CodeFile与CodeBehind的区别
    asp.net防sql注入问题
    .NET创建目录和文件
    Asp.Net判断字符是否是数字
    Asp.Net随机中文汉字验证码
    禁用表单自动提示complete
    如何隐藏vs2005的起始页
    Asp.Net enableEventValidation
  • 原文地址:https://www.cnblogs.com/cnlik/p/11851883.html
Copyright © 2011-2022 走看看