sgu226Colored graph

就是说给你个图,

这个图的每天边都是有颜色的,

用数字1到3表示颜色。

现在要从第一个点走到最后一个点,

如果上一步走过的边与下一步要走的边

颜色不同,就可以走,

问你最少要走几步可以走到目标点。

不能走到的话输出-1。

我用最短路做。

本来只需要加个判断颜色就可以,

可是这个地方可以通过环走到

最后一个点。

面对这种特例,

我想不到办法。

于是用了某人的想法。

只会bellmanford,

于是就用这个算法。

将dis变成二维数组,第二维表示跟某点

相连最近的那条边的颜色。

每次松弛化的时候,枚举三种颜色,

如果枚举到的这条边的颜色与枚举到

的颜色不同,并且,

把这条边加入进来可以让路径变短,

就把这条边加入进来。

最后的话,枚举到最后一个点,三种颜色

的情况,也就是与最后一个点相连的

那个边的颜色情况,取最小值,

如果最小值大于40000,也就是大于

边的无穷大,就可以说明,

第一个点是无法到最后一个点的,

输出-1即可,否则输出最小值。

我的代码如下:

#include<cstring>
#include<iostream>
using namespace std;
int num_dot,num_side;
struct node
{
	int s,e,c;
}side[40010];
void init()
{
	scanf("%d%d",&num_dot,&num_side);
	for(int i=0;i<num_side;i++)
		scanf("%d%d%d",&side[i].s,&side[i].e,&side[i].c);
}
void work()
{
	bool flag;
	int dis[210][4];
	memset(dis,127,sizeof(dis));
	dis[1][1]=dis[1][2]=dis[1][3]=0;
	while(1)
	{
		flag=1;
		for(int i=0;i<num_side;i++)
		{
			for(int k=1;k<4;k++)
			{
				if(k!=side[i].c&&dis[side[i].e][side[i].c]>dis[side[i].s][k]+1)
					dis[side[i].e][side[i].c]=dis[side[i].s][k]+1,flag=0;
			}
		}
		if(flag)
			break;
	}
	int ans=0xfffffff;
	for(int i=1;i<4;i++)
		ans=min(ans,dis[num_dot][i]);
	if(ans>40000)
		printf("-1");
	else
		printf("%d",ans);
}
int main()
{
	init();
	work();
}

sgu226Colored graph

时间: 2024-12-15 01:52:06

sgu226Colored graph的相关文章

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

724G - Xor-matic Number of the Graph(线性基)

724G - Xor-matic Number of the Graph 题意: 待补~~ 参考http://www.cnblogs.com/ljh2000-jump/p/6443189.html

[CodeChef - GERALD07 ] Chef and Graph Queries

Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected graph G. This graph consists of N vertices and M edges. Each vertex of the graph has an unique index from 1 to N, also each edge of the graph has an uniq

HDOJ 5409 CRB and Graph 无向图缩块

无向图缩块后,以n所在的块为根节点,dp找每块中的最大值. 对于每一个桥的答案为两块中的较小的最大值和较小的最大值加1 CRB and Graph Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 113    Accepted Submission(s): 41 Problem Description A connected, undi

【Lintcode】137.Clone Graph

题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. How we serialize an undirected graph: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each

133. Clone Graph

题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's undirected graph serialization: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each n

图像分割之(二)Graph Cut(图割)

[email protected] http://blog.csdn.net/zouxy09 上一文对主要的分割方法做了一个概述.那下面我们对其中几个比较感兴趣的算法做个学习.下面主要是Graph Cut,下一个博文我们再学习下Grab Cut,两者都是基于图论的分割方法.另外OpenCV实现了Grab Cut,具体的源码解读见博文更新.接触时间有限,若有错误,还望各位前辈指正,谢谢. Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image se

Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节点之间则是由张量(Tensor)作为边来连接在一起的.所以Tensorflow的计算过程就是一个Tensor流图.Tensorflow的图则是必须在一个Session中来计算.这篇笔记来大致介绍一下Session.Graph.Operation和Tensor. Session Session提供了O

codeforces 715B:Complete The Graph

Description ZS the Coder has drawn an undirected graph of n vertices numbered from 0 to n - 1 and m edges between them. Each edge of the graph is weighted, each weight is a positive integer. The next day, ZS the Coder realized that some of the weight