图的搜索 (二分图)

1.图的存储

图的存储有两种:
1.邻接矩阵的存法,但是如果存的图太稀疏,会浪费掉大量内存。
2.邻接表的存法,可以节省到很多存储空间,写法很多,这里展示两种

1.邻接矩阵:
就是用一个二位数组存下两点之间的权值,初始化的时候用一个足够大的inf
2.邻接表
第一种:用stl中的vector容器存,这个节点通向的节点们

struct edge{
int to;
int value;
};
vector<edge> g[maxn];
int main()
{
	int v,e;
	cin>>v>>e;
	for(int i=0;i<e;i++)
	{
		int s,t;
		cin>>s>>t;
		g[s].push_back(t);
	}
	//图的操作
	return 0}

ps:1. 其实很邻接矩阵的用法差不多,相当于一个动态的数组,没有必要的点就不申请空间,节省了空间
2.vector的遍历,a.begin() , a.end() ;for(int i=0;i<g[x].size;i++) 后面就用一个二维数组使用,与邻接矩阵类似

第二种:用一个first数组(标号有多少个,就有多大,初始时候为-1),和next数组(根据插入的情况和first的情况),进行存储,有点像记忆的感觉。而且存完之后感觉,读取和存储是两个反的过程。

int n=4,m=6;//n,为标号个数。m,为边数
int u[7],v[7],w[7];
int first[5];
int next[7];
for(int i=1;i<=n;i++)//初始化first数组
{
	first[i]=-1;
}
for(int i=1;i<=m;i++)
{
	scanf("%d%d%d",&u[i],&v[i],&w[i]);
	next[i]=first[u[i]];
	first[u[i]]=i;
}

2.图的搜索(二分图)

1.把相邻顶点染成不同颜色的问题,叫做着色问题。
2.对图进行染色所需的最小颜色数,称为最小颜色数
3.如果最小着色数是2 的图称为二分图
4.因为只有两种颜色,所以顶点颜色确定以后,与之链接的字节的颜色也被确定,用深搜很快就可以get

vector <int> edge[maxn];
int v;//图的节点个数
int color[maxn];//节点的颜色,因为是两种,就用1,-1来表示
bool dfs(int n,int c)//给某个节点上颜色c
{
	color[n]=c;
	for(int i=0;i<edge[n].size();i++)
	{
		if(color[edge[n][i]]==c)
		return false;
		if(!color[edge[n][i]]&&!dfs(edge[n][i],-c)
		return false;
	}
	return true;
}
void solve()
{
	for(int i=0;i<v;i++)
	{
		if(color[i]==0)
		{
			if(!dfs(i,1))
			{
				printf("no\n");
				return ;
			}
		
		}
	}
	printf("yes\n");
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值