zoukankan      html  css  js  c++  java
  • poj1062昂贵的聘礼

    View Code
    /*poj1062昂贵的聘礼
    解法:求一点到其他所有点的最短路径(还要加上终点的pri[]),在一条路径上点与点之间的等级差不能超过n,
    扫描区间因为每条路径都要经过点1,所以依次扫描区间[ lev[1]-n , leve[1] ]......[ lev[1] , lev[1]+n ]
    */
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #define MAXN 1000
    #define INF 100000000
    int lev[MAXN],pri[MAXN],g[MAXN][MAXN],G[MAXN][MAXN],d[MAXN],vis[MAXN];
    using namespace std;
    int m,n,k,a,b;
    void dijkstra(int u)//一点到其他点的最短路,邻接矩阵
    {
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=m;i++)d[i]=(i==u?0:INF);
    for(int i=1;i<=m;i++)
    {
    int x,l=INF;
    for(int y=1;y<=m;y++)if(!vis[y]&&d[y]<=l)l=d[x=y];
    vis[x]=1;
    for(int y=1;y<=m;y++)
    d[y]=min(d[y],d[x]+g[x][y]);
    }
    }
    void sift(int l,int r)//区间筛选,若一条路的两端的等级不在[l,r]内,则把g[i][j]置为INF
    {
    for(int i=1;i<=m;i++)
    for(int j=1;j<=m;j++)
    {
    if(lev[i]>=l&&lev[i]<=r&&lev[j]>=l&&lev[j]<=r)g[i][j]=G[i][j];
    else g[i][j]=INF;
    }
    }
    int pro()
    {
    int ans=INF;
    for(int i=lev[1]-n;i<=lev[1];i++)
    {
    sift(i,i+n);//依次扫描区间
    dijkstra(1);
    for(int i=1;i<=m;i++)
    {
    d[i]+=pri[i];
    ans=min(ans,d[i]);
    }
    }
    return ans;
    }
    int main()
    {

    scanf("%d%d",&n,&m);
    for(int i=0;i<=m;i++)
    for(int j=0;j<=m;j++)
    {
    G[i][j]=INF;
    g[i][j]=INF;
    }
    for(int i=1;i<=m;i++)
    {
    scanf("%d%d%d",&pri[i],&lev[i],&k);
    for(int j=1;j<=k;j++)
    {
    scanf("%d%d",&a,&b);
    G[i][a]=b;
    }
    }
    printf("%d\n",pro());
    }

  • 相关阅读:
    “耐撕”团队 2016.3.25 站立会议
    “耐撕”团队 2016.03.24 站立会议
    “耐撕”团队 2016.3.22 站立会议
    windows环境下的git安装及使用
    词频统计(三)
    第二周作业
    Unity之GUI控件
    Lua的协同程序(coroutine)
    Lua与C++的交互
    Lua的元方法__newindex元方法
  • 原文地址:https://www.cnblogs.com/sook/p/2226432.html
Copyright © 2011-2022 走看看