zoukankan      html  css  js  c++  java
  • 干货系列——模板 之 图论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很像

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

  • 相关阅读:
    [APM] OneAPM 云监控部署与试用体验
    Elastic Stack 安装
    xBIM 综合使用案例与 ASP.NET MVC 集成(一)
    JQuery DataTables Selected Row
    力导向图Demo
    WPF ViewModelLocator
    Syncfusion SfDataGrid 导出Excel
    HTML Table to Json
    .net core 2.0 虚拟目录下载 Android Apk 等文件
    在BootStrap的modal中使用Select2
  • 原文地址:https://www.cnblogs.com/sillyben/p/9929740.html
Copyright © 2011-2022 走看看