zoukankan      html  css  js  c++  java
  • POJ -1062 昂贵的聘礼(前向星 && SPFA)

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/u013497151/article/details/30299671

    题目链接:昂贵的聘礼


       这个题对自己收获挺大的。模板要自己常常敲,才干理解。要自己常常敲,从能温故而知新。自己曾经总结的建图方式。做题的时候要会用,要敢用。否则==NULL。




    题意对于交换条件描写叙述的有点不清楚,这里解释一下,如果8件物品,等级差距不能超过3。酋长LV 5。所以能够进行交换的LV区间是[2,5][3,6][4,7][5,8]。不必考虑题目那一句。“可是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易。他们觉得这样等于是间接接触,反过来也一样”。

    越看越晕。仅仅要符合以上区间的都能够进行交换。


    思路:開始看题时。自己的思路有点偏差,觉得P神仅仅能从价格最廉价、等级最低的那个人開始首次交易,后来敲了。。。再后来。。无从下手了,看了一下Discuss,噢。枚举啊。Discuss上的神牛门大多用Dijkstra 或 Bellman-Ford过的,还剪枝...俺还没学啊。然后,我想Bellman-Ford能过的SPFA肯定也能过。可是SPFA怎么敲,忘了。

    。又又一次复习最短路 And 建图方式,开敲1遍A。中间的小细节自己处理的不好,还不会调程序。又叫P神过来了。

    。。。

    ME        TIME

    720kb    32ms


    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    const int Size = 99999;
    const int INF = 1<<20;
    const int N = 101;
    const int MMM = 10010;
    using namespace std;
    int NN,M,l = 0;
    struct node{
        int v,w,next;
    }edge[MMM];
    int p[N],lv[N],num,t;
    int dis[N],vis[N],lim,low;
    int q[MMM],head[MMM];
    
    int SPFA(int S,int E)
    {
        //printf("low = %d high = %d
    ",low,lim);
        int s = 0,e = 0;
        for(int i = 1;i<=N;i++)
            dis[i] = p[1];
        dis[S] = 0;
        q[e++] = S;
        vis[S] = 1;
        while(s < e)
        {
            int tmp = q[s++];
            for(int i = head[tmp];i!=0;i=edge[i].next)
            {
           if((lv[edge[i].v]>=low && lv[edge[i].v]<=lim )&& (dis[edge[i].v]> dis[tmp] + edge[i].w))
                {
                    dis[edge[i].v] = dis[tmp] + edge[i].w;
                    if(!vis[edge[i].v])
                    {
                        q[e++] = edge[i].v;
                        vis[edge[i].v] = 1;
                    }
                }
            }
            vis[tmp] = 0;
        }
        return dis[E];
    }
    void add(int a,int b,int c) //前向星建图
    {
        edge[t].v = b;
        edge[t].w = c;
        edge[t].next = head[a];
        head[a] = t;
        t++;
    }
    /*void Print()
    {
        int k,i;
        for(i = 0; i <= NN; i++)
        {
            if(head[i])
            {
                for(k = head[i]; k != 0; k = edge[k].next)
              {
                printf("%d->%d %d
    ", i, edge[k].v, edge[k].w);
              }
            }
        }
    }*/
    int main()
    {
        int a,b;
        while(~scanf("%d%d",&M,&NN))
        {
            l = 0;
            t = 1;
            memset(head,0,sizeof(head));
            for(int i = 1;i<=NN;i++)
            {
                scanf("%d%d%d",&p[i],&lv[i],&num);
                add(0,i,p[i]);
                for(int j = 0;j<num;j++)
                {
                 scanf("%d%d",&a,&b);
                 add(a,i,b);
                }
            }
            /*puts("-------------");
            Print(); //打印图形
            puts("-------------");*/
    
            int minn = INF,flag = 0;
            for(int i = lv[1]-M;i<=lv[1];i++) //枚举全部可行交换
            {
                lim = i + M;
                low = i;
                memset(vis,0,sizeof(vis));
                flag = SPFA(0,1);
                (flag < minn)?(minn = flag):(minn=minn);
            }
            printf("%d
    ",minn);
        }
        return 0;
    }
    


  • 相关阅读:
    Linux_access the file or directory which start with "-"
    Jasper_crosstab_measure_display a value of field in crosstab total row
    Linux_Shell符号及各种解释对照表
    Linux_Shell type
    Jasper_passValue_return value from the subreport to main report
    Jasper_table_resolve multiple copies of table in detail band issue
    Jasper_crosstab_headerPosition_columngroup header position config
    Linux
    un ange frappe a ma porte
    Linux
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9949200.html
Copyright © 2011-2022 走看看