zoukankan      html  css  js  c++  java
  • 「日常训练」「小专题·图论」 昂贵的聘礼(1-4)

    题意

    分析

    dijkstra的变形,问题在于把题目的逻辑转化成图。
    这个图(V,E)是这样的:V是各个人(礼物+承诺+探险家),E是花费的金额。如果能够换到,就连一条边。
    这样一来,对[lv1m,lv1][lv1,lv1+m]的各个区间分别求最短路(m次),即可求出答案。
    这道题目建模是关键。图论的特征。

    代码

    // Origin:
    // Theme: Graph Theory (Basic)
    // Date: 080618
    // Author: Sam X
    
    //#include <bits/stdc++.h>
    #include <iostream>
    #include <utility>
    #include <iomanip>
    #include <cstring>
    #include <cmath>
    #define MP make_pair
    #define PB push_back
    #define fi first
    #define se second
    #define ZERO(x) memset((x), 0, sizeof(x))
    #define ALL(x) (x).begin(),(x).end()
    #define rep(i, a, b) for (int i = (a); i <= (b); ++i)
    #define per(i, a, b) for (int i = (a); i >= (b); --i)
    #define QUICKIO                  
        ios::sync_with_stdio(false); 
        cin.tie(0);                  
        cout.tie(0);
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ul;
    typedef pair<int,int> pi;
    typedef pair<int,pi> pii;
    
    int main()
    {
        int m,n; cin>>m>>n;
        int dis[105][105];
        int lv[105];
        memset(dis,0x3f,sizeof(dis));
        rep(i,1,n)
        {
            dis[i][i]=0;
            int p,l,x; cin>>p>>l>>x;
            dis[0][i]=p;
            lv[i]=l;
            rep(j,1,x)
            {
                int t,v; cin>>t>>v;
                dis[t][i]=v;
            }
        }
        int ans=0x3f3f3f3f;
        rep(llv,lv[1]-m,lv[1])
        {
            int rlv=llv+m,d[105];
            memset(d,0x3f,sizeof(d));
            d[0]=0;
            int mind=d[1],x=-1;
            bool vis[105];
            ZERO(vis);
            //cout<<"***
    llv="<<llv<<" rlv="<<rlv<<endl;
            rep(i,0,n)
            {
                mind=0x3f3f3f3f;
                x=-1;
                rep(j,0,n) if(!vis[j] && d[j]<mind) mind=d[x=j];
                if(x==-1) break;
                //cout<<"x="<<x<<endl;
                vis[x]=true;
                rep(j,0,n)
                {
                    if(j==0 || (lv[j]>=llv && lv[j]<=rlv))
                    {
                        d[j]=min(d[j],d[x]+dis[x][j]);
                    }
                }
                //rep(j,0,n) cout<<d[j]<<" "; cout<<endl;
            }
            ans=min(ans,d[1]);
        }
        cout<<ans<<endl;
        return 0;
    }
    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    <C++ QT4 GUI 编程>第一章笔记
    生成snmp++动态库
    PHP 5.3 新特性
    编译安装-Subversion 1.8.5
    Xen入门系列四【Xen 管理实操】
    Xen入门系列三【Xen 管理工具 xm】
    COMET探索系列三【异步通知服务器关闭数据连接实现思路】
    PHP生成二维码【谷歌API+qrcode+圆角Logo】
    SSH免密码登陆详解
    COMET探索系列二【Ajax轮询复用模型】
  • 原文地址:https://www.cnblogs.com/samhx/p/9652053.html
Copyright © 2011-2022 走看看