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

ZOJ  2750 Idiomatic Phrases Game      题意:给出一定数目的节点,每个节点的信息用给出的字符串来表示。如果A字符串的最后4个字符是B字符串开头4个字符,类似B符...
  • weixinwei021
  • weixinwei021
  • 2013年07月28日 21:49
  • 601

zoj 2750 Idiomatic Phrases Game

题意:最短路径,只给出了点和这个点到其他点的距离。 思路:把图构建出来,Dijkstra解之。 代码: #include #include using namespace ...
  • u011251225
  • u011251225
  • 2015年02月17日 13:02
  • 200

HDU 1546 Idiomatic Phrases Game

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1546 题目: Idiomatic Phrases Game Time Lim...
  • shuangde800
  • shuangde800
  • 2012年10月13日 00:20
  • 1444

hdu 1546 Idiomatic Phrases Game(最短路)

Idiomatic Phrases Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O...
  • acm_cxq
  • acm_cxq
  • 2016年05月24日 14:04
  • 239

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
  • 512

hdu 1546 Idiomatic Phrases Game 最短路spfa

题意:成语接龙。给出n个成语,一个成语查到下一个成语需要时间,前一个成语的最后一个字与后一个成语的第一个字相同就可以相接,求第一个成语接到最后一个成语的最短时间。 判断每两个成语是否相连建图,求最短...
  • zchahaha
  • zchahaha
  • 2016年04月02日 10:31
  • 273

ZOJ 2750 Idiomatic Phrases Game(邻接表+dijkstra)

把每个idiom看成两个节点,中间连一条边只为该idiom的值, 两个能连边的idiom连边,权值设为0, 然后各种最短路算法就可以了. 这里判断尾部是否等于头部时候,用枚举的话会超时,最好用m...
  • zxjcarrot
  • zxjcarrot
  • 2013年04月07日 11:17
  • 409

Hdu 1546/Zoj 2750 Idiomatic Phrases Game

最短路问题  Dijkstra 题意: 给出n条边,即n个成语,要求是成语之间能首尾相连所化的最短时间,某个起点有可能是无法到达终点的,是一个有向图。 分析: 先处理字符串,存入图中,然后...
  • Chuck_0430
  • Chuck_0430
  • 2013年08月19日 00:37
  • 669

ZOJ 2750 Idiomatic Phrases Game(最短路,dij)

Idiomatic Phrases Game Time Limit: 2 Seconds Memory Limit: 65536 KB Tom is playing a game...
  • nealgavin
  • nealgavin
  • 2013年02月16日 18:09
  • 334

dijkstra ZOJ 2750 Idiomatic Phrases Game

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1750 题目大意:成语接龙,一串4*n的字符串,4个字符组成...
  • zssee33
  • zssee33
  • 2012年09月05日 18:43
  • 289
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zoj 2750 Idiomatic Phrases Game
举报原因:
原因补充:

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