HDU 1546(Idiomatic Phrases Game)

使用 Dijkstra算法,首先建立有向图,将每个单词作为一个结点,和能直接接在其后的单词连线,然后计算起点到终点的最短距离即可。

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;

struct Word //单词
{
	int time; //查找后续单词所需时间
	char first[5], last[5]; //前4个字符,后4个字符
}word[MAXN];

int N; //单词数
char str[MAXN]; //每次输入的单词
int mp[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];

//建图
void buildMap()
{
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			if (strcmp(word[i].last, word[j].first) == 0)
				mp[i][j] = word[i].time;
			else 
				mp[i][j] = INF;
		}
	}
}

//Dijkstra算法,计算结点s到其他点的最短路径
void Dijkstra(int s)
{
	memset(vis, 0, sizeof(vis));
	for (int i = 1; i <= N; i++)
	{
		dis[i] = mp[s][i];
	}
	
	int k = s, minDis;
	vis[k] = true;
	for (int i = 1; i < N; i++)
	{
		minDis = INF;
		for (int j = 1; j <= N; j++)
		{
			if (vis[j] == true) 
				continue;
			if (minDis > dis[j])
			{
				minDis = dis[j];
				k = j;
			}
		}
		vis[k] = true;
		for (int j = 1; j <= N; j++)
		{
			if (vis[j] == false && dis[j] > dis[k] + mp[k][j])
				dis[j] = dis[k] + mp[k][j];
		}
	}
}

int main()
{
	while (cin >> N)
	{
		if (N == 0)
			break;

		for (int i = 1; i <= N; i++)
		{
			cin >> word[i].time >> str;
			int len = strlen(str);
			for (int j = 0; j < 4; j++)
			{
				word[i].first[j] = str[j];
				word[i].last[j] = str[len - 4 + j];
			}
		}

		buildMap();
		Dijkstra(1);

		if (dis[N] != INF)
			cout << dis[N] << endl;
		else
			cout << -1 << endl;
	}
	return 0;
}

继续加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章