图论(啊哈!算法)
图的邻接矩阵和图
图就是N个顶点和 M条边组成的集合
用二维数组存储图的邻接矩阵用dfs去遍历图
#include<iostream> using namespace std; int map[50][50]; int book[50]; int n,m,sum,sp; bool f; void dfs(int p){ cout<<p<<' '; sum++; if(sum == n){ f=1; return ; } for(int i=1;i<=n;i++){ if(map[p][i] == 1 && !book[i]){ book[i]=1; dfs(i); } } if(f){ return; } return; } int main(){ cin>>n>>m; cin>>sp; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j){ map[i][j]=0; }else{ map[i][j]=1e8; } } } for(int i=1;i<=n;i++){ int a,b; cin>>a>>b; map[a][b]=1; map[b][a]=1; } book[sp]=1; dfs(sp); return 0; }
12435
图的广搜
#include<iostream> using namespace std; int map[50][50]; int book[50]; int n,m; struct node{ int point; }; struct node q[51]; int head,tail; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i == j){ map[i][j]=0; }else{ map[i][j]=1e8; } } } for(int i=1;i<=n;i++){ int a,b; cin>>a>>b; map[a][b]=1; map[b][a]=1; } head=tail=1; q[tail].point=1; tail++; book[1]=1; cout<<1<<' '; while(head!=tail){ int p1=q[head].point; for(int i=1;i<=n;i++){ if(map[p1][i] ==1 && !book[i]){ cout<<i<<' '; book[i]; q[tail].point=i; tail++; } if(tail>n){ break; } }head++; } }
城市结点最短路径:
1号城市到5号城市的最短路径
#include<iostream> using namespace std; int map[50][50]; int book[50]; int n,m,kl=99999,sum; void dfs(int p,int sum){ int b; if(sum>kl){ return; } if(p==5){ if(sum<kl){ kl=sum; } return; } for(int i=1;i<=n;i++){ if(map[p][i] !=99999 && !book[i]){ book[i]=1; b=sum+map[p][i]; dfs(i,b); book[i]=0; } } return; } int main(){ int a,b,c; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j){ map[i][j]=0; }else{ map[i][j]=99999; } } } for(int i=1;i<=m;i++){ cin>>a>>b>>c; map[a][b]=c; } book[1]=1; dfs(1,0); cout<<kl<<endl; return 0; }
最少转机(图的广度优先遍历)
求1到5的转机次数
#include<iostream> using namespace std; struct node{ int p; int step; }; int head,tail; bool f; struct node q[50]; int map[50][50]; int book[50]; int n,m; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i == j){ map[i][j]=1; }else{ map[i][j]=999999; } } } for(int i=1;i<=m;i++){ int a,b; cin>>a>>b; map[a][b]=1; map[b][a]=1; } head=tail=1; q[tail].p=1; q[tail].step=0; tail++; book[1]=1; while(head!=tail){ int temp=q[head].p; for(int i=1;i<=n;i++){ if(map[temp][i] !=999999 && !book[i]){ book[i]=1; q[tail].p=i; q[tail].step=q[head].step+1; tail++; } if(q[tail].p == 5){ f=1; break; } if(f){ break; } } head++; } cout<<q[head-1].step<<endl; return 0; }
当然这里也可以用DFS,但是BFS更适用于所有边的权值相同的情况下。