zoukankan      html  css  js  c++  java
  • 图论模板……未完待续

    把所有能想到的图论模板合到一起,由以下算法组成:

    1.DFS(两款存储方式)

    2.BFS(邻接矩阵)

    3.floyd(邻接矩阵)

    4.dijsktra(邻接矩阵)

    5.spfa(两款存储方式)

    6.tarjan(邻接链表)

    7.prim(邻接矩阵)

    8.kruskal(并查集)

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstring>
      4 #include<cstdio>
      5 #include<queue>
      6 using namespace std;
      7 struct union_find_set
      8 {
      9     int x,y,v;
     10     int father(int x)
     11     {
     12         if (fat[x] != x) fat[x] = father(fat[x]);
     13         return fat[x];
     14     }
     15     void unionn(int x,int y)
     16     {
     17         int fa = father(x);
     18         int fb = father(y);
     19         if (fa != fb) fat[fa] = fb;
     20     }
     21     void init()
     22     {
     23         for (i = 1; i <= n; i++) fat[i] = i;
     24     }
     25     void sort()
     26     {
     27         sort(a+1,a+m+1);
     28     }
     29     bool operator < (const union_find_set &b) const
     30     {
     31         return this->v < b.v;
     32     }
     33 }a[10001];
     34 struct Edge
     35 {
     36     int pre,to,w;
     37 };
     38 void dfs(int p)
     39 {
     40     cout<<p<<" ";
     41     vis[p]=true;
     42     for(int i=1; i<=m; i++)
     43         if(!vis[i])
     44             dfs(i);
     45 }
     46 void bfs(int p)
     47 {
     48     queue<int> q;
     49     q.push(p);
     50     vis[p]=true;
     51     while(!q.empty())
     52     {
     53         int t=q.front();
     54         q.pop();
     55         cout<<t<<" ";
     56         for(int i=1; i<=n; i++)
     57         {
     58             if(map[i][t]&&!vis[i])
     59             {
     60                 q.push(i);
     61                 vis[i]=true;
     62             }
     63         }
     64     }
     65 }
     66 void floyd()
     67 {
     68     for(int k=1; k<=m; k++)
     69         for(int i=1; i<=m; i++)
     70             for(int j=1; j<=m; j++)
     71                 if(map[i][j]>map[i][k]+map[k][j])
     72                     map[i][j]=map[i][k]+map[k][j];
     73 }
     74 void dijsktra(int p)
     75 {
     76     for(int i=1; i<=n; i++)
     77         dis[i]=map[p][i];
     78     vis[p]=true;
     79     dis[p]=0;
     80     for(int i=1; i<=n-1; i++)
     81     {
     82         min1=MAXN1;
     83         k=0;
     84         for(int j=1; j<=n; j++)
     85         {
     86             if(!vis[j]&&dis[j]<min1)
     87             {
     88                 min1=dis[j];
     89                 k=j;
     90             }
     91             vis[k]=true;
     92         }
     93         for(int i=1; i<=n; i++)
     94         {
     95             if(!vis[i]&&map[k][i]<MAXN1&&dis[i]>dis[k]+map[k][i])
     96                 dis[i]=dis[k]+map[k][i];
     97         }
     98     }
     99     cout<<dis[e]<<endl;
    100 }
    101 void spfa(int p)
    102 {
    103     queue<int> q;
    104     q.push(p);
    105     vis[p]=true;
    106     while(!q.empty())
    107     {
    108         int t=q.front();
    109         q.pop();
    110         vis[t]=false;
    111         for(int i=1; i<=n; i++)
    112         {
    113             if(dis[i]>dis[t]+map[t][i])
    114             {
    115                 dis[i]=dis[t]+map[t][i];
    116                 if(!vis[i])
    117                     q.push(i);
    118             }
    119         }
    120     }
    121     cout<<dis[ep];
    122 }
    123 void add_edge(int from,int to,int w)
    124 {
    125     edge[++num_edge].pre=head[from];
    126     edge[num_edge].to=to;
    127     edge[num_edge].w=w;
    128     head[from]=num_edge;
    129 }
    130 void dfs(int now,int fa)
    131 {
    132 
    133     for(int i=head[now]; i!=-1; i=edge[i].next)
    134     {
    135         if(v[edge[i].v]==0)
    136         {
    137             cout<<" "<<edge[i].v;
    138             dfs(edge[i].v,now);
    139             v[edge[i].v]=1;
    140         }
    141     }
    142 }
    143 void SPFA(int u)
    144 {
    145     q.push(u);
    146     if_q[u]=true;
    147     while(!q.empty())
    148     {
    149         u=q.front();
    150         for(int i=head[u]; i!=0; i=edge[i].pre)
    151         {
    152             int v=edge[i].to;
    153             if(dis[u]+edge[i].w<dis[v])
    154             {
    155                 dis[v]=dis[u]+edge[i].w;
    156                 if_q[v]=true;
    157                 q.push(v);
    158             }
    159         }
    160         if_q[u]=false;
    161         q.pop();
    162     }
    163 }
    164 void tarjan(int x)
    165 {
    166     DFN[x]=LOW[x]=++tot;
    167     stack[++index]=x;
    168     visit[x]=1;
    169     for(int i=heads[x]; i!=-1; i=edge[i].next)
    170     {
    171         if(!DFN[edge[i].v])
    172         {
    173             tarjan(edge[i].v);
    174             LOW[x]=min(LOW[x],LOW[edge[i].v]);
    175         }
    176         else if(visit[edge[i].v ])
    177         {
    178             LOW[x]=min(LOW[x],DFN[edge[i].v]);
    179         }
    180     }
    181     if(LOW[x]==DFN[x])
    182     {
    183         do
    184         {
    185             printf("%d ",stack[index]);
    186             visit[stack[index]]=0;
    187             index--;
    188         }
    189         while(x!=stack[index+1]);
    190         printf("
    ");
    191     }
    192 }
    193 void prim()
    194 {
    195     memset(map,0x7f,sizeof(map));
    196     int n,e,x,y,w;
    197     cin>>n>>e;
    198     for(int i=0; i<e; i++)
    199     {
    200         cin>>x>>y>>w;
    201         map[x][y]=map[y][x]=w;
    202     }
    203     memset(minn,0x7f,sizeof(minn));
    204     minn[1]=0;
    205     for(int i=1; i<=n; i++)
    206     {
    207         int k=0;
    208         for(int j=1; j<=n; j++)
    209             if(!vis[j]&&minn[j]<minn[k])
    210                 k=j;
    211         vis[k]=true;
    212         for(int j=1; j<=n; j++)
    213             if(!vis[j]&&map[k][j]<minn[j])
    214                 minn[j]=map[k][j];
    215     }
    216     //输出请手动遍历,就像这样:
    217     for(int i=1; i<=n; i++)
    218         for(int j=1; j<=n; j++)
    219             if(map[i][j]==minn[i])cout<<j<<" "<<i<<endl;
    220 }
    221 void kruskal()
    222 {
    223     a[0].sort();
    224     for (i = 1; i <= m; i++)
    225     {
    226         if (a[i].father(a[i].x) != a[i].father(a[i].father()))
    227         {
    228             a[i].unionn(a[i].x,a[i].y);
    229             tot += a[i].v;
    230             k++;
    231         }
    232         if (k == n-1) break;
    233     }
    234     cout << tot<<endl;
    235     //留坑,这里需要输出这棵树。
    236     ; 
    237 }
    238 void init_for_different_template(int usage)
    239 {
    240     ;
    241 } 
    242 int main()
    243 {
    244     //我不想写了,太多了,编译器炸出了77个错误。
    245     ;
    246     return 0; 
    247 }

    尚未实现的部分:

    1.main函数,init_for_different_template函数

    2.kruskal输出最小生成树。

    3.编译不过。

  • 相关阅读:
    ctags and vim
    [转]bash快捷键
    util-linux编译unknown architecture 'BSD_LABELSECTOR' undeclared错误
    HTML5安全攻防详析之八:Web Socket攻击
    HTML5安全攻防详析之七:新标签攻击
    HTML5安全风险详析之六:API攻击
    HTML5安全风险详析之五:劫持攻击
    HTML5安全风险详析之四:Web Worker攻击
    HTML5安全风险详析之二:Web Storage攻击
    HTML5安全风险详析之一:CORS攻击
  • 原文地址:https://www.cnblogs.com/TheRoadToAu/p/6706403.html
Copyright © 2011-2022 走看看