图论(啊哈!算法)
图的邻接矩阵和图
图就是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更适用于所有边的权值相同的情况下。
浙公网安备 33010602011771号