把所有能想到的图论模板合到一起,由以下算法组成:
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.编译不过。