zoj 2750 Idiomatic Phrases Game

原创 2013年12月04日 18:18:30

题目大意:

    成语接龙游戏,给定一些成语,该组成语中第1个和最后一个必须是给定的两个成语。在这组成语中,前一个成语的最后一个汉字必须和后一个成语的第一个汉字相同。在游戏过程中,Tom有一本字典,他必须从字典中选用成语。字典中每个成语都有一个权值T,表示选用这个成语后,Tom需要花时间T才能找到下一个合适的成语。你的任务是编写程序,给定字典,计算Tom至少需要花多长时间才能找到一个满足条件的成语组。注意,字典中第1个和最后一个成语为游戏中给定的起始和目标成语。输入文件最后一行为N = 0,代表输入结束。

分析:

   假设用图中的顶点代表字典中的每个成语,如果第i个成语的最后一个汉字跟第j个成语的第一个汉字相同,则画一条有向边,由顶点i 指向顶点j,权值为题目中所提到的时间T:选用第i个成语后,Tom需要花时间T才能找到下一个合适的成语。这样,样例输入中两个测试数据所构造的有向网如下图(a)和(b)所示。


构造好有向网后,问题就转化成求一条从顶点0到顶点N-1的一条最短路径,如果从顶点0到顶点N-1没有路径,则输出-1。


#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 1010;
const int INF = 10000010;


struct Idiom
{
	char front[5],back[5];//每个成语的前一个字和后一个字
	int T;//查找单词所花费的时间
};

Idiom dic[MAXN];//存放每个成语的属性
int S[MAXN];
int Edge[MAXN][MAXN];//储存图
int dist[MAXN];//记录从原点到每个顶点的最短路径
int n;

void Dijkstra(int v0)
{
	int i, j;
	for (i = 0; i < n; ++i)
	{
		dist[i] = Edge[v0][i];
		S[i] = 0;
	}
	S[v0] = 1, dist[v0] = 0;

	for (i = 1; i < n; ++i)
	{
		int MIN = INF, v = v0;
		for (j = 0; j < n; ++j)
		{
			if(!S[j] && MIN > dist[j])
			{
				MIN = dist[j];
				v = j;
			}
		}
		S[v] = 1;
		for (j = 0; j < n; ++j)
		{
			if(!S[j] && Edge[v][j] < INF && dist[j] > dist[v] + Edge[v][j])
				dist[j] = dist[v] + Edge[v][j];
		}
	}
}

int main()
{
	int i, j, k;
	while (cin>>n)
	{
		if(n == 0)
			break;
		for (i = 0; i < n; ++i)
		{
			char s[50];
			cin>>dic[i].T>>s;
			int len = strlen(s);
			for (j = 0, k = len-1; j < 4; ++j, --k)//记录第i个成语的第一个字和最后一个字
			{
				dic[i].front[j] = s[j];
				dic[i].back[3-j] = s[k];
			}
			dic[i].back[4] = dic[i].front[4] = '\0';
		}

		for (i = 0; i < n; ++i)//建图
		{
			for (j = 0; j < n; ++j)
			{
				Edge[i][j] = INF;
				if(i == j)
					continue;
				if(strcmp( dic[i].back, dic[j].front ) == 0)//说明第i个成语的最后一个字与第j个成语的第一个字相同,则,连一条从i到j的边
					Edge[i][j] = dic[i].T;//权值为花费的时间
			}
		}
		Dijkstra( 0 );
		if(dist[n-1] < INF)
			cout<<dist[n-1]<<endl;
		else
			cout<<"-1"<<endl;
	}
	return 0;
}


版权声明:本文为博主原创文章,转载需注明出处。

ZOJ--2750--Idiomatic Phrases Game【dijkstra】

题意:给你一部字典,上面有n个成语,成语3个字或4个字,每个汉字由四位16进制位表示,现要求从中选一些成语来进行接龙游戏,即后一个成语的第一个字和前一个成语的最后一个字一样,找到一个成语后要过T的时间...
  • zzzz40
  • zzzz40
  • 2014年07月26日 22:30
  • 709

ZOJ-2750- Idiomatic Phrases Game

根据字符串间首尾4个字符是否相同建立新图,然后求一条从0点到n-1点的最短路径即可。 Dijkstra代码: #include #include #include using namespac...

zoj 2750 Idiomatic Phrases Game(最短路径)

Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese characters...

ZOJ:2750 Idiomatic Phrases Game

Dijkstra算法求最短路。 之前一直TLE于是用了优先队列用了char[],其实是 shortpath[i]=shortpath[v]+gl[v][i]; 这里在gl[v][i]为无穷大即v...
  • kkkwjx
  • kkkwjx
  • 2013年10月12日 17:57
  • 485

zoj 2750 Idiomatic Phrases Game(最短路)

一道前期处理有点麻烦,实际很简单的最短路。 题意: 成语接龙,要求前一个成语的末尾四个字符与后一个成语的前4个字符相等。每一个成语找到下一个成语都有相应的时间,现在要找到到最后一个成语所需要的最短...
  • cqlf__
  • cqlf__
  • 2012年01月01日 12:25
  • 573

杭电 1546 Idiomatic Phrases Game 最短路 Dijstra

题意:给定一个整数  和一串字符串,当字符串末端的四个字符与另一字符串的首端四个字符相同时,加上前面的字符串,然后找出连接状态的最小值,而且每一个符合条件的字符串的首尾四个字符必须相同,才能相加 #...

HDU-1546-Idiomatic Phrases Game

ACM模版描述题解模版大法好~~~最短路模版题,不过需要进行一些处理来建图。题意:已知成语至少有3个汉字,每个汉字用4个字符(十六进制数)表示,成语接龙游戏,求从第一个成语接到最后一个成语的最小花费。...
  • f_zyj
  • f_zyj
  • 2016年11月21日 18:29
  • 140

hdu 1546 Idiomatic Phrases Game【dijkstra】

Idiomatic Phrases Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O...

HDU1546 Idiomatic Phrases Game 最短路径(Dijkstra算法)

Problem Description Tom is playing a game called Idiomatic Phrases Game. An idiom consists of sever...

hdu1546Idiomatic Phrases Game (dijkstra的变形)

Problem Description Tom is playing a game called Idiomatic Phrases Game. An idiom consists of sever...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zoj 2750 Idiomatic Phrases Game
举报原因:
原因补充:

(最多只允许输入30个字)