zoukankan      html  css  js  c++  java
  • ZOJ 2750 Idiomatic Phrases Game(Dijkstra)

    点我看题目

    题意 : 给定一本字典,字典里有很多成语,要求从字典里的第一个成语开始,运用字典里的成语变到最后一个成语,变得过程就是成语接龙,后一个成语的第一个字必须有前一个成语的最后一个字相等,给定的成语是4位16进制位,每个成语前边跟的数字代表着找到这个成语之后再找到下个成语还需要t分钟 。

    思路 :将所有的成语看成一个点,如果找到下一个成语,就建一条有向边,然后用dijkstra求最短路。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    
    using namespace std;
    
    struct node
    {
        char f[5],b[5] ;
        int timee ;
    } dicti[1010] ;
    const int INF = 999999999 ;
    int edge[1010][1010] ;
    int dist[1010] ;
    int n ;
    bool vis[1010] ;
    char ch[1010] ;
    
    void dijkstra()
    {
        for(int i = 0 ; i < n ; i++)
            dist[i] = edge[0][i],vis[i] = false ;
        vis[0] = true ;
        dist[0] = 0 ;
        for(int i = 0 ; i < n-1 ; i++)
        {
            int minn = INF , u = 0 ;
            for(int j = 0 ; j < n ; j++)
            {
                if(!vis[j] && dist[j] < minn)
                {
                    u = j ;
                    minn = dist[j] ;
                }
            }
            vis[u] = true ;
            for(int j = 0 ; j < n ; j++)
            {
                if(!vis[j] && dist[j] > dist[u]+edge[u][j])
                    dist[j] = dist[u]+edge[u][j] ;
            }
        }
    }
    int main()
    {
        while(~scanf("%d",&n) && n)
        {
            for(int i = 0 ; i < n ; i++)
            {
                scanf("%d %s",&dicti[i].timee,ch) ;
                int len = strlen(ch) ;
                for(int k = 0 ,j = len-1 ; k < 4 ; j--, k++)
                {
                    dicti[i].f[k] = ch[k] ;
                    dicti[i].b[3-k] = ch[j] ;
                }
                dicti[i].f[4] = dicti[i].b[4] = '' ;
            }
            for(int i = 0 ; i < n ; i++)
            {
                for(int j = 0 ; j < n ; j++)
                {
                    edge[i][j] = INF ;
                    if(i == j) continue ;
                    if(strcmp(dicti[i].b,dicti[j].f) == 0)
                        edge[i][j] = dicti[i].timee ;
                }
            }
            dijkstra() ;
            if(dist[n-1] == INF) printf("-1
    ") ;
            else printf("%d
    ",dist[n-1]) ;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    为什么需要配置环境变量
    Highcharts使用简例 + 异步动态读取数据
    使用SQL检测死锁
    2015.12.21-2015.12.25单词
    SQL Server锁定【2015.12.17】
    SQL SERVER 并发【2015.12.16】
    SQL闲杂知识点汇总【2015年12月】
    键和约束【2015.12.11】
    [笔记]聚集索引和非聚集索引相关知识点
    论Top与ROW_NUMBER读取第一页的效率问题
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3633615.html
Copyright © 2011-2022 走看看