首页 > Web开发 > 详细

POJ 1062 最短路Dijstra

时间:2015-06-18 16:44:27      阅读:122      评论:0      收藏:0      [点我收藏+]

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

看的解题报告。思路大概是把每个点看做最高等级。然后枚举所有当前可以访问的点。进行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 << "==\n";
            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

POJ 1062 最短路Dijstra

原文:http://www.cnblogs.com/icode-girl/p/4586130.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!