U118795 成语游戏(Idiomatic Phrases Game)

题目背景

题目来源: Zhejiang Provincial Programming Contest 2006, ZOJ2750

题目描述

Tom 正在玩一种成语接龙游戏。成语是一个包含多个中文字符、具有一定含 义的短语。游戏规则是:给定 Tom 两个成语,他必须选用一组成语,该组成语中 第 1 个和最后一个必须是给定的两个成语。在这组成语中,前一个成语的最后一 个汉字必须和后一个成语的第一个汉字相同。在游戏过程中,Tom 有一本字典, 他必须从字典中选用成语。字典中每个成语都有一个权值 T,表示选用这个成语 后,Tom 需要花时间 T 才能找到下一个合适的成语。你的任务是编写程序,给定 字典,计算 Tom 至少需要花多长时间才能找到一个满足条件的成语组。 输入描述: 输入文件包含多个测试数据。每个测试数据包含一本成语字典。 字典的第 1 行是一个整数 N,0

输入格式

``` //选择建图的方式真的很重要,偷个懒,用dfs #include #include #include using namespace std; struct Edge { int to,w,next; } edges[1000000]; const int mn=1001; int n,m,w[mn]; char s[100],a[mn][5],b[mn][5];//a记录前4个字母,b记录后4个字母 int vis[mn];//记录一条路径上的结点 int dis[mn];//记录距离 int head[mn]; void add(int i,int j) { edges[m].to=j; edges[m].w=w[i]; edges[m].next=head[i]; head[i]=m++; } void dfs(int i) { for(int j=head[i]; ~j; j=edges[j].next) { int v=edges[j].to; if(dis[v]>dis[i]+edges[j].w) { dis[v]=dis[i]+edges[j].w; vis[v]=1; dfs(v); vis[v]=0; } } } int main() { while(~scanf("%d",&n)&&n) { for(int i=0; i

输出格式