POJ - 1062 昂贵的聘礼 解题报告

昂贵的聘礼 POJ - 1062

 

终于有一到中文的题了,好激动。哈哈哈。。。

题目大意:

ez要去搞对象,酋长的女儿。那不就是寒冰嘛。。。。 

大概就是个Bellford-Ford算法。开始理解的很乱,然后根据测试实例画了个图。


思路:

比如要是想要B需要100元,用A换就只需要20元,并且A需要30元。这件事就可以想成是,从A到B(单向)距离为20。但是从B为起点是100元,从A为起点需要30元。就是这个图了嘛。黑色的就是从一个点到另一个点的花费。每个点底下的蓝色的数就是从这个点出生的花费(生个好地方不容易啊)

然后就很显然,以1号点为原点,bf一下,就得到了在不考虑出生花费的情况下,各个点到1号点的最小花费。然后这个花费加上出生花费最小的,就是到1号点的最小花费。

然后有一个很先进的等级系统,那帮人真是死要面子活受罪。这个酋长的地位是不是最高的啊,这个很重要!我猜是~ 15min后····靠!酋长的等级可能不是最高,坑爹啊。

然后解决办法就是枚举每一个等级区间,因为肯定要和酋长交易,所以就以酋长的等级为固定点。

最后就要娶到公主了~(这种背景的题,不猥琐怎么行)

#include
   
   
    
    
#include
    
    
     
     
#define N 150
#define inf 0x3f3f3f3f

using namespace std;
int dis[N]={0};
int moy[N]={0};
int vip[N]={0};
int m,n;
int s[N*N]={0};
int e[N*N]={0};
int v[N*N]={0};
int num=0;//¼Ç¼±ßÊý 
 int dj=0;//µÈ¼¶ 
 
void input()
{
	cin>>m>>n;//µÈ¼¶×î´ó²î¾àm£¬ÎïÆ·×ÜÊýn 
	int first=1;
	for(int i=1;i<=n;i++)
	{
		int p,l,x;
		scanf("%d%d%d",&p,&l,&x);//PÎïÆ·µÄ¼Û¸ñ¡¢LÖ÷È˵ĵØλµÈ¼¶¡¢XÌæ´úÆ·×ÜÊý
		if(first==1)
		{
			dj=l; 
			first=0;
		}
		//¾ÍÒòΪÏÂÃæÕâ¸öÅжÏÓï¾ä¿ÓÁËÎҺðëÌ죬continueÖ®ºó£¬ºóÃæµÄmoy[i]£¬vip[i]¾Í¿ÕÁËÒ»¸öÁË¡£ 
		/*if(l
     
     
      
      dj+m)//µÈ¼¶²»ÔÚ·¶Î§ÄÚ 
		{
			continue;
		}*/
		moy[i]=p;
		vip[i]=l;
		for(int j=0;j
      
      
       
       =min && vip[s[j]]<=max && vip[e[j]]>=min && vip[e[j]]<=max && dis[s[j]]>dis[e[j]]+v[j] )
			{
				dis[s[j]]=dis[e[j]]+v[j];
			}
			
		}
	}
	
}
int output()
{
	int min=inf;
	for(int i=1;i<=n;i++)
	{
		if(min>dis[i]+moy[i])
		{
			min=dis[i]+moy[i];
		}
	}
	return min;
}

int main()
{
	input();
	int min=inf;
	for(int i=0;i<=m;i++)
	{
		
		Bellman_ford(dj+i,dj-m+i);
		int t=output();
		if(min>t)min=t;
	}
	
	cout<
       
       
         < 
         
       
      
      
     
     
    
    
   
   

反思:

之后上网上查了别人的代码。好像有一个思想叫超级源点什么的。意思就是,把在各个点出生的花费设成0号点到这些点的花费。这样bf之后就可以直接出答案了。从抽象原理上应该是一样的,我只是把从0号点引出的所有边放到了外面。先把从各个顶点到1号顶点的最短路径封装起来,距离存为dis[i]。然后在看,从0到各个点再通过封装好的路到1哪个花费最少。

不过这个超级源点思想(我也忘了是不是叫这个了,先这么记下来吧)倒是挺好。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值