1. 程式人生 > >圖的基本操作(無向帶權圖鄰接矩陣)

圖的基本操作(無向帶權圖鄰接矩陣)

程式碼任意輸入數字進行測試,注意點從1開始輸入

#include<iostream>
#include<queue>
#include<cstdlib>
using namespace std;

#define inf 99999
#define maxsize 10

queue<int> seq;

int edge[maxsize][maxsize];
int nv,ne;
int visited[maxsize];

int init()//初始化 
{
	for(int i=1;i<=nv;i++)
		for(int j=1;j<=nv;j++)
		if(i==j)
			edge[i][j]=0;
		else
			edge[i][j]=inf;
};

void tozero()
{
	memset(visited,0,sizeof(visited));
}

int creat()//建圖 
{
	init();
	int a,b,weigh;
	for(int i=1;i<=ne;i++)
	{
		cin>>a>>b>>weigh;
		edge[a][b]=edge[b][a]=weigh;
	}
}

void DFS(int t,int ope)//深度優先搜尋 ope控制是否列印剛搜到的點,1是列印 
{
	if(!visited[t])
	{
		if(ope)
			cout<<t<<" ";
		visited[t]=1;
		for(int i=1;i<=nv;i++)
			if(edge[t][i]!=inf)
				DFS(i,ope);
	}
}

void BFS(int t)//廣度優先搜尋 
{
	int tmp;
	seq.push(t);
	visited[t]=1;
	while(!seq.empty())
	{
		tmp=seq.front();
		cout<<tmp<<" ";
		seq.pop();
		for(int i=1;i<=nv;i++)
			if(edge[tmp][i]!=inf&&!visited[i])
			{
				seq.push(i);
				visited[i]=1;
			}
	}
	cout<<endl;
}

bool islink()//檢查圖是否連通 
{
	if(nv-1>ne)
		return false;
	tozero();
	DFS(1,0);
	for(int i=1;i<=nv;i++)
		if(!visited[i])
			return false;
	return true;
}
bool istree()//檢出圖是否為樹 
{
	return (nv==ne+1)&&islink();
}

bool havepath(int a,int b)//檢查兩點之間是否有路徑 
{
	tozero();
	DFS(a,0);
	return visited[b];
}
int main()
{
	cin>>nv>>ne;
	creat();
	tozero();
	DFS(1,1);
	tozero();
	cout<<endl;
	BFS(1);
	cout<<islink()<<endl;
	cout<<istree()<<endl;
	return 0;
}