zoukankan      html  css  js  c++  java
  • POJ 1062 最短路Dijstra

    汉语题。。。 题意正如你看到的酱。。。

    看的解题报告。思路大概是把每个点看做最高等级。然后枚举所有当前可以访问的点。进行dijstra算法。找到此时到目标点最短路。枚举完之后找到最小的点就可以了。

    POJ还在继续BUG中。。。。。代码应该是对的没有AC。。。。

    附代码:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #define maxn 210
    #define inf 0x1f1f1f1f
    using namespace std;

    bool vis[maxn];   // 表示是否访问过
    int dist[maxn]; // 源点到目标点的价格。即原价
    int price[maxn][maxn]; // price[t][i]表示替代品是t时i的价格。
    int x[maxn]; //x[i]表示i物品有多少替代品。
    int min_p, temp_p;
    int m, n;
    int lv[maxn]; // lv[i]表示i物品主人的等级

    void init()
    {
        memset(lv, 0, sizeof(lv));
        memset(dist, inf, sizeof(dist));
        memset(price, 0, sizeof(price));
        memset(vis, false, sizeof(vis));
        min_p = inf;
    }

    int dijstra()
    {
        temp_p = 0;
        for (int i=1; i<=n; ++i)
        {
            dist[i] = price[0][i];
        }
        for (int i=1; i<=n; ++i)
        {
            int mmin = inf;
            int k = 0;
            for (int j=1; j<=n; ++j)
            {
               if (!vis[j] && dist[j] < mmin)
               {
                   mmin = dist[j];
                   k = j;
               }
            }
            if (k == 0) break;
            vis[k] = true;
            temp_p += mmin;
            for (int j=1; j<=n; ++j)
            {
                if (!vis[j] && price[k][j] > 0 && dist[j] > dist[k] + price[k][j])
                    dist[j] = dist[k] + price[k][j];
            }
        }
        return dist[1];
    }


    int main()
    {
        while(cin >> m >> n)
        {
            init();
            for (int i=1; i<=n; ++i)  // 物品标号从1到n.
            {
                cin >> price[0][i] >> lv[i] >> x[i];
                for (int j=0; j<x[i]; ++j)
                {
                    int t, v;
                    cin >> t >> v;
                    price[t][i] = v;
                }
            }
            for (int i=1; i<=n; ++i)  // 把每个点作为最高等级 尝试遍历寻找到目标点1的最短路
            {
                for (int j=1; j<=n; ++j)
                {
                    if (lv[j] > lv[i] || lv[i] - lv[j] > m)
                        vis[j] = true;
                    else vis[j] = false;
                }
                //cout << temp_p << "== ";
                temp_p = dijstra();
                if (temp_p < min_p)
                    min_p = temp_p;
            }
            cout << min_p << endl;
        }
        return 0;
    }
    附参考出处:http://blog.csdn.net/lyy289065406/article/details/6645852

  • 相关阅读:
    Spark RDD简介与运行机制概述
    MongoDB 3.0.6的主,从,仲裁节点搭建
    kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
    Spark配置参数调优
    SparkSQL项目中的应用
    SparkSQL相关语句总结
    Hadoop系统架构
    Hadoop常用命令
    spark单机模式简单搭建
    Spark参数配置说明
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4586130.html
Copyright © 2011-2022 走看看