poj1062

来源:互联网 发布:php fpm mysql长连接 编辑:程序博客网 时间:2024/06/05 11:49

           看似很简单的一道中文题目,着实花了不少时间,看了大牛的解题思路,

才发现自己的思路完全不清晰,只有一个很模糊的大概,下面切入正题。


            这道题有两种方法可以用,可以用最短路 Dijkstra 算法 ,也可以DFS 搜索


先说一说 Dijkstra 方法:

           每种物品都看成一个结点,包括聘礼为第一件结点。这样,将兑换需要的金币

看成每条边的权值,这样就可以构造出一个图,在等级范围内进行筛选和连接。

需要注意的是以下两点:


           1 :这个图是逆向构造的,在逆向的情况下,利用Djikstra算法得到取代第一个

结点的值。如果正向构造,很容易混乱可取代和取代不了的情况金币。起初的想法就

是正向构造,然后一直为这个纠结,看了大牛的日志恍然大悟,想问题应该由简入繁,

这样思路才能逐渐清晰起来。


           2: 这道题很重要的也是这个等级限制,苦苦纠结于怎么表达这个限制,看了

别人的日志发现,自己构造的方法复杂而不容易表达,很混乱。

*由于酋长的等级不一定是最高的,所以在不同的等级下,需要考虑假设每个结点在

最高等级(最低等级)下的得出的最小值。

 

          3:0x7fffffff表示int型的最大值。

                #define   INF   0x7fffffff

               memset(data,INF,sizeof(data));

                      此时data数组里所有的值为-1  


代码如下:

#include<iostream>#include<cmath>#include<cstring>using namespace std;#define inf 0x7fffffffbool visit[150];int price[150][150];int m,n;int num[150];int dist[150];int level[150];void init(){     memset(price,inf,sizeof(price));     memset(num,0,sizeof(num));     memset(level,0,sizeof(level));     cin >> m >> n;     for(int i=1; i<=n; i++)     {          cin >> price[0][i] >> level[i] >> num[i];          for(int j = 1; j <= num[i]; j++)          {               int t,l;               cin >> t >> l;               price[t][i] = l;          }     }     return ;}int Dijkstra(){     int i,j;     for(i=1;i<=n;i++)          dist[i]=price[0][i];     for(i=1;i<=n;i++)     {          int ans=0,min=inf;          for(j=1;j<=n;j++)               if(dist[j]<min&&!visit[j])               {                    min=dist[j];                    ans=j;               }          if(ans==0)               break;          visit[ans]=true;          for(j=1;j<=n;j++)               if(!visit[j]&&price[ans][j]>0&&dist[j]>dist[ans]+price[ans][j])                     dist[j]=dist[ans]+price[ans][j];     }     return dist[1];}int main(){     int temp,minprice=inf,i,j;     init();     for(i=1;i<=n;i++)     {          int lev=level[i]; //设置当前等级为最高等级          for(j=1;j<=n;j++)          {               if(lev<level[j]||lev-level[j]>m))                    visit[j]=true;               else                    visit[j]=false;          }          temp=Dijkstra();          minprice=minprice<temp? minprice:temp;     }     cout << minprice << endl;     return 0;}





0 0
原创粉丝点击