[poj 1502]昂贵的聘礼

一道不算太难的最短路喵~

容我吐槽一下,酋长的地位居然不是最高的额——那你特么的居然还算是酋长?!

枚举一个地位区间 [i..i+M-1] 只要所有的交易者的地位都在该区间中,那么就不会引起冲突

而这个可悲的酋长是必须在区间中的,所以若酋长的地位为 L0 那么该枚举的区间就是 [L0-i, L0+M-i] {i|0<=i<=M}

然后就是裸的 dijkstra 了,取出地位在区间中的点,然后新增一个点 N+1,向所有点连边,距离是所有物品的直接价格

若 物品 i 可以通过 物品 j 来降价,那么从 j 向 i 连一条边,距离为降价后的价格

以 N+1 为源点跑一个最短路就可以了

我发现带内部调整的优先队列不是蛮好写的嘛~

  1 #include <cstdio>
  2 #include <cstring>
  3 const int sizeOfPoint=128;
  4 const int sizeOfEdge=32768;
  5
  6 int n;
  7 int h[sizeOfPoint];
  8 inline int getint();
  9 inline void putint(int);
 10
 11 struct edge {int point, dist; edge * next;};
 12 edge memory[sizeOfEdge], * port=memory;
 13 edge * e[sizeOfPoint];
 14 inline edge * newedge(int point, int dist, edge * next)
 15 {
 16     edge * ret=port++;
 17     ret->point=point; ret->dist=dist; ret->next=next;
 18     return ret;
 19 }
 20 inline void link(int u, int v, int d)
 21 {
 22     e[u]=newedge(v, d, e[u]); e[v]=newedge(u, d, e[v]);
 23 }
 24
 25 struct priority_queue
 26 {
 27     int size, q[sizeOfPoint];
 28     int id[sizeOfPoint];
 29     inline int front() {return q[1];}
 30     inline bool exist(int x) {return id[x]>0;}
 31     inline void down(int i)
 32     {
 33         register int x=q[i];
 34         register int j;
 35         for (j=i<<1;j<=size;i=j, j=i<<1)
 36         {
 37             if (j<size && h[q[j+1]]<h[q[j]]) j++;
 38             if (h[q[j]]<h[x]) id[q[i]=q[j]]=i;
 39             else break;
 40         }
 41         id[q[i]=x]=i;
 42     }
 43     inline void up(int i)
 44     {
 45         register int x=q[i];
 46         register int j;
 47         for (j=i>>1;j;i=j, j=i>>1)
 48             if (h[q[j]]>h[x]) id[q[i]=q[j]]=i;
 49             else break;
 50         id[q[i]=x]=i;
 51     }
 52     inline void build(int _size)
 53     {
 54         size=_size;
 55         for (int i=1;i<=size;i++) id[q[i]=i]=i;
 56         for (int i=size>>1;i;i--) down(i);
 57     }
 58     inline void pop()
 59     {
 60         id[q[1]]=0;
 61         id[q[1]=q[size--]]=1;
 62         down(1);
 63     }
 64     inline void deskey(int x)
 65     {
 66         up(id[x]);
 67     }
 68 };
 69
 70 inline int min(int x, int y) {return x<y?x:y;}
 71 inline int max(int x, int y) {return x>y?x:y;}
 72 inline void dijkstra();
 73
 74
 75 int main()
 76 {
 77     n=getint();
 78     for (int i=2;i<=n;i++)
 79         for (int j=1;j<i;j++)
 80         {
 81             int A=getint();
 82             if (A>=0) link(i, j, A);
 83         }
 84     memset(h, 0x3F, sizeof h); h[1]=0;
 85     dijkstra();
 86
 87     int ans=0;
 88     for (int i=1;i<=n;i++) ans=max(ans, h[i]);
 89
 90     putint(ans);
 91
 92     return 0;
 93 }
 94 inline int getint()
 95 {
 96     register int num=0;
 97     register char ch=0;
 98     do ch=getchar(); while ((ch<‘0‘ || ch>‘9‘) && ch!=‘x‘);
 99     if (ch==‘x‘) return -1;
100     do num=num*10+ch-‘0‘, ch=getchar(); while (ch>=‘0‘ && ch<=‘9‘);
101     return num;
102 }
103 inline void putint(int num)
104 {
105     char stack[15];
106     register int top=0;
107     if (num==0) stack[top=1]=‘0‘;
108     for ( ;num;num/=10) stack[++top]=num%10+‘0‘;
109     for ( ;top;top--) putchar(stack[top]);
110     putchar(‘\n‘);
111 }
112 inline void dijkstra()
113 {
114     priority_queue q;
115     q.build(n);
116     for ( ;q.size; )
117     {
118         int u=q.front(); q.pop();
119         for (edge * i=e[u];i;i=i->next) if (q.exist(i->point) && h[i->point]>h[u]+i->dist)
120         {
121             h[i->point]=h[u]+i->dist;
122             q.deskey(i->point);
123         }
124     }
125 }

本傻装B系列

时间: 2024-08-26 11:00:27

[poj 1502]昂贵的聘礼的相关文章

POJ - 1062昂贵的聘礼最短路或者DFS

POJ - 1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit Status Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如

POJ 1062 昂贵的聘礼 最短路

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求

poj 1062 -- 昂贵的聘礼

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35515   Accepted: 10163 Description 年 轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿 不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要 5

poj 1062 昂贵的聘礼 解题报告

题目链接:http://poj.org/problem?id=1062 这一题只要想到如何建图,就不太难解决了.假设对于编号为 i 的物品,如果它得到物品 j 后价格从 pricei 降低到 pricej 的话,就用一个cost[i][j] = pricej.也就是从物品 i 到物品 j 连一条有向边.每一个编号的物品都这样处理,然后套用dijk 算法,求出从每个点出发的最短路,最终最小的那个就是答案.考虑到等级限制,别人可以跟酋长接触的前提是这个人的等级在 [ level 酋长-m  ~ le

POJ -1062 昂贵的聘礼(前向星 &amp;&amp; SPFA)

题目链接:昂贵的聘礼 这个题对自己收获挺大的,模板要自己经常敲,才能理解,要自己经常敲,从能温故而知新,自己以前总结的建图方式,做题的时候要会用,要敢用,否则==NULL. 题意对于交换条件描述的有点不清楚,这里解释一下,假设8件物品,等级差距不能超过3,酋长LV 5,所以可以进行交换的LV区间是[2,5][3,6][4,7][5,8],不必考虑题目那一句,"但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样".越看越晕,只要

poj 1062 昂贵的聘礼 (dijkstra最短路)

题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36799   Accepted: 10616 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的

poj 1062 昂贵的聘礼 (最短路)

poj 1062 昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他

POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49916   Accepted: 14961 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到

poj 1062 昂贵的聘礼 Dijkstra算法,中等难度,,,一道让我累觉不爱的题目

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38474   Accepted: 11132 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000