• 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());
    }

  • 相关阅读:
    总结的反爬虫手段(持续更新)
    爬虫类编程笔记导航
    技术开发流程小公司
    敏捷开发学习笔记(一)
    .NET Framework各版本比较
    linux shell 之 cut
    Hive insert overwrite 出现错误解决方法
    hive join
    linux shell 之 grep
    hive实现not in
  • 原文地址:https://www.cnblogs.com/sook/p/2226432.html
Copyright © 2020-2023  润新知