poj-1847 之最短路

本题目就是简单的最短路

 

题目理解起来有点费劲,大概说一下吧!

就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。

这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。

 

题目给的实例

3 2 1 //有3个开关点,计算从第二个到第一个最少需要旋转几次

2 2 3//第1个开关可以通向2 和3 ,通向2不需要旋转,通向3需要旋转1次

2 3 1//第2个开关可以通向3 和1, 通向3不需要旋转,通向1需要旋转1次

所以直接建图,最短路即可,floyd dijstra bellman spfa这四种算法都可以

下面给出floyd和spfa

#include <stdio.h>

#define maxN 110
#define  inf 1000000000

int mat[maxN][maxN];
bool flag[maxN][maxN];
bool vis[maxN];
int dis[maxN];
int queue[10 * maxN];

int n,a,b;


void Init()//初始化
{
	for (int i = 1; i <= n; ++ i)
	{
		for (int j = 1; j <= n; ++ j)
		{
			if (i == j)
			{
				mat[i][j] = 0;
			}
			else
				mat[i][j] = inf;
			flag[i][j] = false;
		}
		vis[i] = false;
		dis[i] = inf;
	}
}

void spfa()	//	spfa算法
{
	int head = 0, tail = 1;
	queue[head] = a;
	dis[a] = 0;
	while (head < tail)
	{
		int u = queue[head];
		vis[u] = true;
		for (int i = 1; i <= n; ++ i)
		{
			if (flag[u][i] && dis[i] > dis[u] + mat[u][i])
			{
				dis[i] = dis[u] + mat[u][i];
				if (!vis[i])
				{
					vis[i] = true;
					queue[tail] = i;
					tail ++;
				}
			}
		}
		vis[u] = false;
		head ++;
	}
	if (dis[b] >= inf)
	{
		printf("-1\n");
	}
	else
		printf("%d\n", dis[b]);
}

void floyd()	//floyd 算法
{
	for (int i = 1; i <= n; ++ i)
	{
		for (int j = 1; j <= n; ++ j)
		{
			for (int k = 1; k <= n; ++ k)
			{
				if (mat[j][k] > mat[j][i] + mat[i][k])
				{
					mat[j][k] = mat[j][i] + mat[i][k];
				}
			}
		}
	}
	if (mat[a][b] >= inf)
	{
		printf("-1\n");
	}
	else
		printf("%d\n", mat[a][b]);
}
int main()
{
	while (scanf("%d%d%d", &n, &a, &b) != EOF)
	{
		//scanf("%d%d%d", &n, &a, &b);
		Init();
		for (int i = 1; i <= n; ++ i)
		{
			int m,v;
			scanf("%d", &m);
			for (int j = 0; j < m; ++ j)
			{
				scanf("%d", &v);
				if (j == 0)
				{
					mat[i][v] = 0;
				}
				else
					mat[i][v] = 1;
				//mat[i][v] = !(j == 0);
				flag[i][v] = true;
			}
		}
		spfa();//两种方法,可以调用spfa也可以调用floyd算法,两个都行,由于数据比较小,时间上没有差别。如果要调用floyd只需要将本行屏蔽,打开下一行即可
		//floyd();
	}
	return 0;
}


 

你可能感兴趣的:(算法)