HDU 1546 Idiomatic Phrases Game 解题报告 (Dijkstra + map容器)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1546

这题……神他妈史前亚特兰大巨坑。题意还是挺好明白的,就是成语接龙,只要把每一个成语当作一条有向边来处理,起始的四个字符当作有向边的起始点,最后四个字符当作结束点,前面输入的查找时间当作边权就行了,再利用map容器转换成数字处理,其实挺好想的,但是又几个坑点需要注意一下。

第一:要注意虽然说是成语,但是这个成语的字数不固定,只是说要大于等于3,说不定弄个二百字的成语也tm可能,所有把input数组弄大一点,WA到死简直我tm。

第二:一定要让起始的最后一个字连接到目标的第一个字, 想一想成语接龙是怎么个流程就明白了。

第三:好像没有第三了……

上一波C艹实现吧,C++可A

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 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 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();
    }
}

 

你可能感兴趣的:(HDU 1546 Idiomatic Phrases Game 解题报告 (Dijkstra + map容器))