• POJ 1062 昂贵的聘礼(最短路)题解


    题意:中文题意不解释...

    思路:交换物品使得费用最小,很明显的最短路,边的权值就是优惠的价格,可以直接用Dijkstra解决。但是题目中要求最短路路径中任意两个等级不能超过m,我们不能在连最短路的时候直接判断,但是我们可以通过预处理+遍历解决。因为一条路径肯定有一个最小level的人,我们假设他为x,那么我们假设x从1一直枚举到n,然后判断哪些点可以在这条路径中,然后把这些点拿去跑最短路,这样一次次遍历得到最短路,然后得到最短路中的最小值就是最终的最小花费。

    #include<cstdio>
    #include<set>
    #include<cmath>
    #include<stack>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int maxn = 100+5;
    const int INF = 0x3f3f3f3f;
    int mp[maxn][maxn];
    int dis[maxn];
    int vis[maxn];
    int pr[maxn];
    int level[maxn];
    bool ok[maxn];
    int n,m;
    int dijkstra(){
        memset(vis,0,sizeof(vis));
        for(int i = 1;i <= n;i++) dis[i] = pr[i];
        //dis[st] = 0;
        for(int i = 1;i <= n;i++){
            int Min = INF,k = 0;
            for(int j = 1;j <= n;j++){
                if(!vis[j] && ok[j] && dis[j] < Min){
                    Min = dis[j];
                    k = j;
                }
            }
            vis[k] = 1;
            for(int j = 1;j <= n;j++){
                if(dis[j] > dis[k] + mp[k][j] && ok[j]){
                    dis[j] = dis[k] + mp[k][j];
                }
            }
        }
        return dis[1];
    }
    
    int main(){
        while(scanf("%d%d",&m,&n) != EOF){
            memset(mp,INF,sizeof(mp));
            for(int i = 1;i <= n;i++){
                int x;
                scanf("%d%d%d",&pr[i],&level[i],&x);
                while(x--){
                    int t,v;
                    scanf("%d%d",&t,&v);
                    mp[t][i] = v;
                }
            }
            int ans = INF;
            for(int i = 1;i <= n;i++){  //枚举假设i是当前路径最小的level
                for(int j = 1;j <= n;j++){
                    if(level[j] < level[i] || level[j] - level[i] > m)
                        ok[j] = false;
                    else ok[j] = true;
                }
                int ret = dijkstra();
                ans = min(ret,ans);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    递归实现随机数不重复问题
    今天写的一个工厂工具类
    Win7 x64 IIS运行ASP+Access故障完美解决方法(转)
    li中,标题和日期一排,且日期靠右
    [学习笔记] extends implements 的区别与联系 [转载]
    [学习笔记] vim使用大全 [转]
    MidPoint Displacement for Terrain Rendering
    CryEngine3 打造另一个真实世界
    Hello C++ AMP!
    DetailMap For Terrain Rendering
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9414775.html
Copyright © 2020-2023  润新知