传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1546
这题……神他妈史前亚特兰大巨坑。题意还是挺好明白的,就是成语接龙,只要把每一个成语当作一条有向边来处理,起始的四个字符当作有向边的起始点,最后四个字符当作结束点,前面输入的查找时间当作边权就行了,再利用map容器转换成数字处理,其实挺好想的,但是又几个坑点需要注意一下。
第一:要注意虽然说是成语,但是这个成语的字数不固定,只是说要大于等于3,说不定弄个二百字的成语也tm可能,所有把input数组弄大一点,WA到死简直我tm。
第二:一定要让起始的最后一个字连接到目标的第一个字, 想一想成语接龙是怎么个流程就明白了。
第三:好像没有第三了……
上一波C艹实现吧,C++可A
#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <cstring>
#include <string>
#include <functional>
using namespace std;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
struct node{
int v, w, next;
}edge[MAXN];
int head[MAXN], cnt = 0, dis[MAXN], vis[MAXN];
void add(int u, int v, int w){
for(int i = head[u];i != -1;i = edge[i].next){
if(edge[i].v == v){
if(w < edge[i].w)
edge[i].w = w;
return;
}
}
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
struct point{
int x, d;
point(){};
point(int x, int d):x(x),d(d){};
friend bool operator < (point a, point b){
return a.d > b.d;
}
};
int dijkstra(int st, int ed){
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f, sizeof(dis));
dis[st] = 0;
priority_queue<point > q;
q.push( point(st, 0) );
while(!q.empty() ){
int u = q.top().x;
q.pop();
if(vis[u] == 0){
vis[u] = 1;
for(int i = head[u];i != -1; i = edge[i].next){
int v = edge[i].v, w = edge[i].w;
if(vis[v] == 0 && dis[v] > (dis[u] + w)){
dis[v] = dis[u] + w;
q.push(point(v, dis[v]) );
}
}
}
}
return dis[ed];
}
int main(){
//freopen("input.txt", "r", stdin);
int n;
while(~scanf("%d", &n) && n){
cnt = 0;
memset(head, -1, sizeof(head));
int num = 1, u, v, w, st, ed, st_w;
map<string, int> mp;
for(int i = 0;i < n;++i){
char input[2000], ch_u[5], ch_v[5];
scanf("%d%s", &w, input);
int len = strlen(input);
for(int j = 0;j < 4;++j){
ch_u[j] = input[j];
ch_v[j] = input[len - 4 + j];
}
ch_u[4] = '\0';
ch_v[4] = '\0';
if(mp[ch_u] == 0)
mp[ch_u] = ++num;
if(mp[ch_v] == 0)
mp[ch_v] = ++num;
u = mp[ch_u];
v = mp[ch_v];
add(u, v ,w);
if(i == 0){
st = v;
st_w = w;
}
if(i == n - 1)
ed = u;
}
int ans = dijkstra(st, ed);
if(ans == INF)
printf("-1\n");
else
printf("%d\n", ans + st_w);
mp.clear();
}
}