图的代码实现


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

//图的邻接矩阵存储表示
#define MaxInt 32767	//表示极大值,即无穷
#define MVNum 100		//最大顶点数
typedef char VerTexType;	//假设顶点的数据类型为字符型
typedef int ArcType;		//假设边的权值类型为整形
typedef struct
{
	VerTexType vexs[MVNum];		//顶点表
	ArcType arcs[MVNum][MVNum];	//邻接矩阵
	int vexnum, arcnum;			//图的当前点数和边数
}AMGraph;

//确定顶点位置
int LocateVex(AMGraph G, VerTexType v)
{
	int i;
	for (i = 0; i < G.vexnum; ++i)
	{
		if (G.vexs[i] == v)
		{
			break;
		}
	}
	return i;
}

//用邻接矩阵创建无向图
bool CreateUDN(AMGraph& G)
{
	int i, j, k;
	cout << "请输入总顶点数:" << endl;
	cin >> G.vexnum;
	cout << "请输入总边数:" << endl;
	cin >> G.arcnum;

	//依次输入点的信息,存入顶点表中
	cout << "请依次输入点的消息:" << endl;
	for (int i = 0; i < G.vexnum; ++i)
	{
		cin >> G.vexs[i];
	}

	//初始化邻接矩阵,边的权值均置为极大值MaxInt
	for (int i = 0; i < G.vexnum; ++i)
	{
		for (int j = 0; j < G.vexnum; ++j)
		{
			G.arcs[i][j] = MaxInt;
		}
	}

	//构造邻接矩阵
	for (int k = 0; k < G.arcnum; ++k)
	{
		//1.定义两个顶点和边的权值
		VerTexType v1 = 0, v2 = 0;
		ArcType w = 0;
		cout << "请分别输入边上的两点及边的权值:" << endl;
		cin >> v1 >> v2 >> w;	//输入一条边依附的顶点及权值
		//2.确定两个顶点在图中的位置
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		//3.两个顶点之间的权值
		G.arcs[i][j] = w;		//边<v1,v2>的权值置为w
		//4.无向图邻接矩阵权值对称
		G.arcs[j][i] = G.arcs[i][j];	//置<v1,v2>的对称边<v2,v1>的权值为w
	}
	return 1;
}


//返回第一个邻接点
VerTexType getFirstNeighbor(VerTexType v, AMGraph G)
{
	int i = LocateVex(G, v); //找到顶点v的存储位置
	for (int j = i; j < G.vexnum; j++) 
	{
		if (G.arcs[i][j] > 0) 
		{
			return G.vexs[j];	//找到第一个大于0的边
		}
	}
	return '0';	//不存在则返回'0'
}


//返回下一个邻接点
VerTexType getNextNeighbor(VerTexType v, VerTexType w, AMGraph G) 
{
	int i = LocateVex(G, v);
	int j = LocateVex(G, w);
	for (int k = j + 1; k < G.vexnum; k++)
	{	 
		//从w开始找,找到w后面第一个大于0的边
		if (G.arcs[i][k] > 0 && G.arcs[i][k] != 32767)
		{
			return G.vexs[k];
		}
	}
	return '0'; //不存在则返回'0'
}


//深度优先遍历
int visited[MVNum]; //访问标记数组
void DFS(AMGraph G, VerTexType v) 
{
	cout << v << " ";
	visited[LocateVex(G, v)] = 1;
	for (VerTexType w = getFirstNeighbor(v, G); w != '0'; w = getNextNeighbor(v, w, G)) 
	{
		if (!visited[LocateVex(G, w)])
		{
			DFS(G, w);
		}
	}
}
void DFSTraverse(AMGraph G)
{
	int count = 0;	//连通分量的初始值为0
	for (int i = 0; i < G.vexnum; i++)
	{
		visited[i] = 0; //初始化标记数组
	}
	for (int i = 0; i < G.vexnum; i++) 
	{
		if (!visited[i]) 
		{
			DFS(G, G.vexs[i]);
			count++;	//每调用一次DFS,连通分量就增加一个
		}
	}
	cout << endl;
	cout << "连通分量的数量为:" << count << endl;
}


//广度优先遍历
void BFS(AMGraph G, VerTexType v) 
{
	queue<VerTexType> vex; //借助队列存储邻接顶点
	cout << v << " ";
	visited[LocateVex(G, v)] = 1;
	vex.push(v);
	while (!vex.empty()) 
	{
		VerTexType u = vex.front(); //获取队首元素
		vex.pop(); //出队
		for (VerTexType w = getFirstNeighbor(u, G); w != '0'; w = getNextNeighbor(u, w, G))
		{
			if (!visited[LocateVex(G, w)]) 
			{
				cout << w << " ";
				visited[LocateVex(G, w)] = 1;
				vex.push(w); //入队
			}
		}
	}
}
void BFSTraverse(AMGraph G)
{
	int count = 0;	//连通分量的初始值为0
	for (int i = 0; i < G.vexnum; i++) 
	{
		visited[i] = 0;		//初始化标记数组
	}
	for (int i = 0; i < G.vexnum; i++)
	{
		if (!visited[i]) 
		{
			BFS(G, G.vexs[i]);
			count++;	//每调用一次BFS,连通分量就增加一个
		} 
	}
	cout << endl;
	cout << "连通分量的数量为:" << count << endl;
}


int main()
{

	AMGraph G;
	int k;

	cout << "1:创建无向图  2:打印邻接矩阵  3:深度遍历  4:广度遍历  5:退出程序" << endl;
	cout << endl;
	do
	{
		cout << "请输入相应数值,选择操作:" << endl;
		cin >> k;
		switch (k)
		{
		case 1:
			CreateUDN(G);
			cout << endl;
			break;

		case 2:
			cout << "邻接矩阵为:" << endl;
			for (int i = 0; i < G.vexnum; ++i)
			{
				for (int j = 0; j < G.vexnum; ++j)
				{
					if (j != G.vexnum - 1)
					{
						if (G.arcs[i][j] != MaxInt)
						{
							cout << G.arcs[i][j] << "\t";
						}
						else
						{
							cout << "∞" << "\t";
						}
					}
					else
					{
						if (G.arcs[i][j] != MaxInt)
						{
							cout << G.arcs[i][j] << endl;
						}
						else
						{
							cout << "∞" << endl;
						}
					}
				}
			}
			cout << endl;
			break;

		case 3:
			cout << "深度优先遍历的结果为:" << endl;
			DFSTraverse(G);
			cout << endl;
			break;

		case 4:
			cout << "广度优先遍历的结果为:" << endl;
			BFSTraverse(G);
			cout << endl;
			break;

		default:cout << "已退出程序!" << endl; break;
		}
	} while (k != 5);
	return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android轮播是一种常见的UI组件,用于在应用中展示多张片,并自动进行切换。以下是一种常见的Android轮播代码实现方式: 1. 首先,在你的项目中添加一个ViewPager控件和一个指示器(Indicator)控件,用于展示片和指示当前片位置。 2. 创建一个适配器(Adapter)类,继承自PagerAdapter,并重写以下方法: - getCount():返回轮播片数量。 - instantiateItem():创建并返回一个ImageView作为ViewPager的一个页面,并加载对应位置的片。 - destroyItem():销毁指定位置的页面。 3. 在Activity或Fragment中,初始化ViewPager和指示器,并设置适配器。 4. 在适配器中,使用一个集合来保存轮播片资源或片URL。可以使用第三方库如Glide或Picasso来加载片。 5. 为了实现自动轮播,可以使用Handler和Runnable来定时切换ViewPager的当前页面。在适配器中,可以通过重写getPageWidth()方法来设置每个页面的宽度,从而实现无限循环轮播。 6. 为指示器添加相应的样式和逻辑,以显示当前页面的位置。 下面是一些相关问题: 1. 什么是ViewPager? 2. 如何使用Glide或Picasso加载片? 3. 如何实现无限循环轮播? 4. 如何添加指示器(Indicator)控件? 5. 如何处理轮播的点击事件? 请注意,以上只是一种常见的实现方式,实际上还有其他多种实现轮播的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x3f3f3f3f3f

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值