图论(啊哈!算法)

图的邻接矩阵和图

图就是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更适用于所有边的权值相同的情况下。

 

posted on 2020-04-08 10:25  二进制dd  阅读(247)  评论(0编辑  收藏  举报

导航