前言
目录里面包含了所有上课提到的内容,这肯定不是一天能理解吸收的。 我只有代码模板,但是不包含讲解,想深入了解的同学可以去各个平台搜对应的名字学习与补全自己的知识面。 刷模板题可以去洛谷。
洛谷题目编号
dfs/bfs
- P1219 八皇后
- P2392 kkksc03考前临时抱佛脚
- P1443 马的遍历
- P1135 奇怪的电梯
- P2895 Meteor Shower S
- P1036 选数
- P2036 PERKET
- P1433 吃奶酪
- P1605 迷宫
- P1101 单词方阵
- P1596 Lake Counting S
- P1162 填涂颜色
- P1825 Corn Maze S
拓扑排序
最短路
最小生成树
DFS
BFS
拓扑排序
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int h[N],e[N],ne[N],idx;
int n,m;
int q[N],d[N];
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
bool topsort(){
int hh=0,tt=-1;
for(int i=1;i<=n;i++){
if(!d[i]) q[++tt]=i;
}
while(hh<=tt){
int now=q[hh++];
for(int i=h[now];i!=-1;i=ne[i]){
int j=e[i];
d[j]--;
if(d[j]<=0) q[++tt]=j;
}
}
return tt==n-1;
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof(h));
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
add(a,b);
d[b]++;
}
if(topsort()){
for(int i=0;i<n;i++) cout<<q[i]<<" ";
}else{
cout<<-1<<endl;
}
return 0;
}
链式前向星
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
struct node{
int to,next;
int val;
}edge[maxn];
int head[maxn],top;
int n,m;
void init(){
memset(head,-1,sizeof(head));
top=0;
}
void add(int u,int v,int w){
edge[top].to=v;
edge[top].next=head[u];
edge[top].val=w;
head[u]=top++;
}
int main(){
init();
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
for(int i=1;i<=n;i++){
for(int j=head[i];~j;j=edge[j].next){
int d=edge[j].to;
}
}
return 0;
}
Dijkstra
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=510;
int dis[N];
int vis[N];
int maps[N][N];
int n,m;
int dijkstra(){
memset(dis,INF,sizeof(dis));
dis[1]=0;
for(int i=1;i<=n;i++){
int k=-1;
for(int j=1;j<=n;j++){
if(!vis[j]&&(k<0||dis[j]<dis[k])){
k=j;
}
}
vis[k]=1;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],dis[k]+maps[k][j]);
}
}
return dis[n];
}
int main(){
cin>>n>>m;
memset(maps,INF,sizeof(maps));
for(int i=1;i<=n;i++) maps[i][i]=1;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
maps[x][y]=min(z,maps[x][y]);
}
int ans=dijkstra();
if(ans==INF) cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
Dijkstra(堆优化)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
const int INF=0x3f3f3f3f;
typedef pair<int,int> pii;
int n,m;
int h[N],w[N],e[N],ne[N],idx;
int dis[N];
int vis[N];
void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
int dijkstra(){
memset(dis,INF,sizeof(dis));
dis[1]=0;
priority_queue<pii,vector<pii>,greater<pii> > heap;
heap.push({0,1});
while(heap.size()){
auto t=heap.top();
heap.pop();
int ver=t.second,dist=t.first;
if(vis[ver]) continue;
vis[ver]=1;
for(int i=h[ver];i!=-1;i=ne[i]){
int j=e[i];
if(dis[j]>dis[ver]+w[i]){
dis[j]=dis[ver]+w[i];
heap.push({dis[j],j});
}
}
}
if(dis[n]==INF) return -1;
return dis[n];
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
memset(h,-1,sizeof(h));
while(m--){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
cout<<dijkstra()<<endl;
return 0;
}
Floyd
#include<bits/stdc++.h>
using namespace std;
const int N=210;
const int INF=0x3f3f3f3f;
int n,m,q;
int mp[N][N];
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
}
int main(){
cin>>n>>m>>q;
memset(mp,INF,sizeof(mp));
for(int i=1;i<=n;i++) mp[i][i]=0;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
mp[a][b]=min(mp[a][b],c);
}
floyd();
while(q--){
int a,b;
cin>>a>>b;
if(mp[a][b]>INF/2){
cout<<"impossible"<<endl;
continue;
}
cout<<mp[a][b]<<endl;
}
return 0;
}
Prim
#include<bits/stdc++.h>
using namespace std;
const int N=510,INF=0x3f3f3f3f;
int n,m;
int g[N][N];
int dis[N];
int vis[N];
int prim(){
memset(dis,INF,sizeof(dis));
int res=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!vis[j]&&(t==-1||dis[t]>dis[j])){
t=j;
}
}
if(i&&dis[t]==INF) return INF;
if(i) res+=dis[t];
vis[t]=1;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],g[t][j]);
}
}
return res;
}
int main(){
cin>>n>>m;
memset(g,INF,sizeof(g));
for(int i=0;i<m;i++){
int a,b,w;
cin>>a>>b>>w;
g[a][b]=g[b][a]=min(g[a][b],w);
}
int t=prim();
if(t==INF) cout<<"impossible"<<endl;
else cout<<t<<endl;
return 0;
}
Kruskal
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=200010,INF=0x3f3f3f3f;
int n,m;
int p[N];
struct Edge{
int a,b,w;
bool operator< (const Edge &W)const{
return w<W.w;
}
}edges[M];
int find(int x){
if (p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int kruskal(){
sort(edges,edges+m);
for (int i=1;i<=n;i++) p[i]=i;
int res = 0, cnt = 0;
for (int i=0;i<m;i++){
int a=edges[i].a,b=edges[i].b,w=edges[i].w;
a = find(a), b = find(b);
if (a!=b){
p[a]=b;
res+=w;
cnt++;
}
}
if (cnt<n-1) return INF;
return res;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
edges[i]={a,b,w};
}
int t=kruskal();
if (t==INF) printf("impossible\n");
else printf("%d\n", t);
return 0;
}
|