图论模板……未完待续

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

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("\n");
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.编译不过。

posted @ 2017-04-13 21:58  baka  阅读(160)  评论(0编辑  收藏  举报