干货系列——模板 之 图论1
Posted sillyben
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货系列——模板 之 图论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 head,next,to,val; 3 }e[10001]; 4 int n,m,x,y,z,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 add(y,x,z); 20 } 21 }
有向图
1 struct Edge{ 2 int head,next,to,val; 3 }e[10001]; 4 int n,m,x,y,z,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很像
好的,今天的干货分享就到这里呢,还有一些正在啃,后续会慢慢分享给大家
以上是关于干货系列——模板 之 图论1的主要内容,如果未能解决你的问题,请参考以下文章
机器学习|数学基础Mathematics for Machine Learning系列之图论:匹配的概念
机器学习|数学基础Mathematics for Machine Learning系列之图论:匹配的概念
机器学习|数学基础Mathematics for Machine Learning系列之图论:树及其性质
机器学习|数学基础Mathematics for Machine Learning系列之图论:树及其性质