链式前向星模板+dijkstra堆优化模板
链式前向星模板题+dijkstra堆优化
一.链式前向星
1.链式前向星的复杂度
链式前向星的构造类似于静态建立邻接表,其复杂度只与边数e有关 – 时间复杂度:O(e),空间复杂度:O(e)。
2.链式前向星的变量
struct edge{
	int to, dis, next;
};
//to : 起点的编号		dis : 起点到终点的距离		next : 起点相同的上一条边的编号
edge e[maxn];
//记录边的信息
int head[maxn],dis[maxn],cnt;
//head[i] : 表示以i为起点的最后一条边的存储位置
//dis[i] : 第i个点的所需距离(例如最短距离等)
//cnt自加,代表边数 
3.链式前向星的加边
void add(int u,int v,int d)
{
	e[++cnt].dis = d;
	e[cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt;
} 
下面的pre是为了观察比较写的,代表起点,在代码中不存在; 例如输入有4个点,4条边: ①1 2 7
②1 3 5
③1 4 5
④2 3 9
4.链式前向星的模板题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e7 + 10;
int n,m,flag;
struct edge{
	int to,dis,next;
}e[maxn];
int head[maxn],dis[maxn],cnt;
inline void add(int u,int v,int d)
{
	e[++cnt].dis = d;
	e[cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}
int main()
{
	scanf("%d%d%d",&n,&m,&flag);
	int u,v,d;
	if(flag){
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d%d",&u,&v,&d);
			add(u,v,d);
		}
	}
	else{
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d%d",&u,&v,&d);
			add(u,v,d);
			add(v,u,d);
		}
	}
	//链式前向星的遍历
	for(int i = 1; i <= n; i++)
	{
		int k = 0;
		//例如上面的例子,从起点出发的最后一条边开始遍历,直到为0,也就是没有边了,就结束遍历
		for(int j = head[i]; j ; j = e[j].next)
		{
			printf("%d %d %d
",i,e[j].to,e[j].dis);
			k = 1;
		}
		if(!k)	printf("
");
	}
	return 0;
} 
二.dijkstra + 堆优化
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const int minn = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
struct edge{
	int to,dis,next;
};
edge e[500010];
int head[maxn],dis[maxn],cnt;
int n,m,s;
inline void add(int u,int v,int d)
{
	cnt++;
	e[cnt].dis = d;
	e[cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}
struct node{
	int index,dist;
	node(int _index=0,int _dist=0):index(_index),dist(_dist){}
	bool operator < (const node &x) const
	{
		return dist > x.dist;
	}
};
priority_queue <node> q;
inline void dij()
{
	dis[s] = 0;
	q.push(node(s,0));
	
	while(!q.empty())
	{
		node t = q.top();
		q.pop();
		int x = t.index, d = t.dist;
		if(dis[x] < d)	continue;
		for(int i = head[x]; i; i = e[i].next)
		{
			int y = e[i].to;
			if(dis[y] > dis[x] + e[i].dis)
			{
				dis[y] = dis[x] + e[i].dis;
				q.push(node(y,dis[y]));
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i = 1; i <= n; i++)
		dis[i] = INF;
	for(int i = 0; i < m; i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	dij();
	for(int i = 1; i <= n; i++)
		printf("%d ",dis[i]);
	return 0;
}
			          上一篇:
			            通过多线程提高代码的执行效率例子 
			          
			          
			        