干货系列——模板 之 图论1

简介: 图论常用模板:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图的建立 1.邻接矩阵建图。

图论常用模板:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

图的建立

 

1.邻接矩阵建图。

无向图:

1 int g[1001][1001],x,y,z,n,m;
2 cin>>n>>m;
3 for(int i=1;i<=m;i++)
4 {
5     cin>>x>>y>>z;
6     g[x][y]=g[y][x]=z;
7 }

有向图:

1 int g[1001][1001],x,y,z,n,m;
2 cin>>n>>m;
3 for(int i=1;i<=m;i++)
4 {
5     cin>>x>>y>>z;
6     g[x][y]=z;
7 }

 

2.链式前向星建图:

无向图:

 1 struct Edge{
 2     int next,to,val;
 3 }e[10001];
 4 int n,m,x,y,z,tot=0,head[10001];
 5 void add(int x,int y,int z)
 6 {
 7     e[++tot].to=y;
 8     e[tot].val=z;
 9     e[tot].next=head[x];
10     head[x]=tot; 
11 }
12 int main()
13 {
14     cin>>n>>m;
15     for(int i=1;i<=m;i++)
16     {
17         cin>>x>>y>>z;
18         add(x,y,z);
19         add(y,x,z);
20     }
21 }

有向图

 1 struct Edge{
 2     int next,to,val;
 3 }e[10001];
 4 int n,m,x,y,z,head[10001],tot=0;
 5 void add(int x,int y,int z)
 6 {
 7     e[++tot].to=y;
 8     e[tot].val=z;
 9     e[tot].next=head[x];
10     head[x]=tot; 
11 }
12 int main()
13 {
14     cin>>n>>m;
15     for(int i=1;i<=m;i++)
16     {
17         cin>>x>>y>>z;
18         add(x,y,z);
19     }
20 }

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··~~~~~~~~~~~

最短路

 

1.Floyd算法

 1 int d[1001][1001],n,m;
 2 //邻接矩阵建图略 , d[i][j]为i到j的最短路 
 3 for(int k=1;k<=n;k++)
 4 {
 5     for(int i=1;i<=n;i++)
 6     {
 7         for(int j=1;j<=n;j++)
 8         {
 9             d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
10         }
11     }
12 }

 

2.Dijkstra算法

 1 int a[3010][3010],d[3010],n,m;
 2 bool v[3010];
 3 void dijkstra(int v0)
 4 {
 5     memset(d,0x3f3f3f3f,sizeof(d));
 6     memset(v,0,sizeof(v));
 7     d[v0]=0;
 8     for(int i=1;i<n;i++) 
 9     {
10         int x=0;
11         for(int j=1;j<=n;j++)
12             if(!v[j]&&(x==0||d[j]<d[x])) 
13                 x=j;
14         v[x]=1;
15         for(int y=1;y<=n;y++)
16             d[y]=min(d[y],d[x]+a[x][y]); 
17     }
18 }

堆优化的Dijkstra算法

 1 const int N=10001,M=1000010;
 2 int head[N],ver[M],edge[M],Next[M],d[N];
 3 bool v[N];
 4 int n,m,tot=0;
 5 priority_queue<pair<int,int>>q;
 6 void add(int x,int y,int z)
 7 {
 8     ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
 9 }//链式前向星的另一种写法
10 void dijkstra(int v0)
11 {
12     memset(d,0x3f3f3f3f,sizeof(d));
13     memset(v,0,sizeof(v));
14     d[v0]=0;
15     q.push(make_pair(0,v0));
16     while(q.size())
17     {
18         int x=q.top().second;
19         q.pop();
20         if(v[x]) continue;
21         v[x]=1;
22         for(int i=head[x];i;i=Next[i])//非常重要的写法,一定要记住 
23         {
24             int y=ver[i],z=edge[i];
25             if(d[y]>d[x]+z)
26             {
27                 d[y]=d[x]+z;
28                 q.push(make_pair(-d[y],y));
29             }
30         }
31     }
32 }

3.bellman算法

 

 1 int n,m,d[10001];
 2 struct Edge{
 3     int a,b,w;
 4 }e[10001];
 5 bool bellman(int v0)
 6 {
 7     memset(d,0x3f3f3f3f,sizeof(d));
 8     d[v0]=0;
 9     for(int i=1;i<n;i++)
10     {
11         for(int j=1;j<=m;j++)
12         {
13             if(d[e[j].a]+e[j].w<d[e[j].b])
14             {
15                 d[e[j].b]=d[e[j].a]+e[j].w;
16             }
17         }
18     }
19     for(int j=1;j<=m;j++)
20     {
21         if(d[e[j].a]+e[j].w<d[e[j].b])//判断负环 
22             return false;
23     }
24     return true;
25 }

4.SPFA算法

 1 int head[3010],ver[3010],edge[3010],Next[3010],d[3010];
 2 int n,m,tot=0;
 3 bool v[3010];
 4 queue<int>q;
 5 void add(int x,int y,int z)
 6 {
 7     ver[++tot]=y,edge[tot]=z,next[tot]=head[x],head[x]=tot;
 8 }
 9 void SPFA(int v0)
10 {
11     memset(d,0x3f3f3f3f,sizeof(d));
12     memset(v,0,sizeof(v));
13     d[v0]=0;
14     v[v0]=1;
15     q.push(v0);
16     while(q.size())
17     {
18         int x=q.front();
19         q.pop();
20         v[x]=0;
21         for(int i=head[x];i;i=Next[i])
22         {
23             int y=ver[i],z=edge[i];
24             if(d[y]>d[x]+z)
25             {
26                 d[y]=d[x]+z;
27                 if(!v[y])
28                 q.push(y),v[y]=1;
29             }
30         }
31     }
32 }

其实和堆优化Dijkstra很像

好的,今天的干货分享就到这里呢,还有一些正在啃,后续会慢慢分享给大家

相关文章
最小生成树(模板)
最小生成树(模板)
37 0
|
7月前
二分图相关模板
二分图相关模板
34 0
背包问题(模板)
背包问题(模板)
52 0
|
存储 算法 UED
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(上)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
94 0
|
算法 容器
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(下)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
115 0
|
机器学习/深度学习 算法
代码随想录训练营day42| 416. 分割等和子集
代码随想录训练营day42| 416. 分割等和子集
计算几何模板
计算几何模板
71 0
|
人工智能 BI C语言
【数论】【模板】
【数论】【模板】
105 0
|
机器学习/深度学习 算法
[洛谷 P3376] 网络最大流 | 模板 (Dinic算法) 入门
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式 第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。 输出格式 一行,包含一个正整数,即为该网络的最大流。
241 0
[洛谷 P3376] 网络最大流 | 模板 (Dinic算法) 入门