链式前向星模板+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;
}
上一篇:
通过多线程提高代码的执行效率例子
