zoukankan      html  css  js  c++  java
  • poj1602 昂贵的聘礼

    这题要求的是最短路径的搜索,还有一个就是要枚举,因为你虽然用最短路去搜,但是不知到要在哪里终止,并且不知到他们的step是不是已经超过了,所以需要枚举,创建时要用到的就是用0来作为起始的0点,(也是看网上的),
    #include"stdio.h"
    #include"math.h"
    #define maxn 10000000
    
    int map[101][101],level[101];
    int step,n,ans;
    
    void dij()
    {
    	int mark[101],dist[101],i,j,k,min,start;
    	
    	ans = maxn;
    	for(k=0;k<=step;k++)//枚举而已,其中距离为step,慢慢枚举
    	{
    		for(i=1;i<=n;i++)
    		{
    			//纯dij
    			if(level[i]-level[1]<=k && level[1]-level[i]<=step-k)//因为间接的也不行,所以需要每次的距离之间是step,
    			{
    				mark[i] = 0;
    				dist[i] = map[0][i];
    			}
    			else
    			{
    				mark[i] = 1;
    				dist[i] = maxn;
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			min = maxn;
    			start = 1;
    			for(j=1;j<=n;j++)
    			{
    				if(!mark[j] && dist[j]<min)
    				{
    					min = dist[j];
    					start = j;
    				}
    			}
    			mark[start] = 1;
    			for(j=1;j<=n;j++)
    			{
    				if(!mark[j] && dist[j]>dist[start]+map[start][j])
    				{
    					dist[j] = dist[start]+map[start][j];
    				}
    			}
    			
    		}
    		if(ans>dist[1])ans = dist[1];
    	}
    	printf("%d\n",ans);
    }
    
    int main()
    {
    	int i,j,k;
    	int P,L,X,T,V;
    	scanf("%d%d",&step,&n);
    	for(i=0;i<=n;i++)for(j=0;j<=n;j++)map[i][j] = maxn;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d%d%d",&P,&L,&X);
    		map[0][i] = P;
    		level[i] = L;
    		for(j=1;j<=X;j++)
    		{
    			scanf("%d%d",&T,&V);
    			map[T][i] = V;
    		}
    	}
    	dij();
    	return 0;
    }
    
  • 相关阅读:
    python数据采集与多线程效率分析
    Memcache使用基础
    《大规模 web服务开发》笔记
    画了一张PHPCMSV9的运行流程思维导图
    MySQL的正则表达式
    linux patch 格式与说明(收录)
    Memcached笔记之分布式算法
    bzoj 2120 带修改莫队
    bzoj 2073 暴力
    bzoj 1814 Ural 1519 Formula 1 插头DP
  • 原文地址:https://www.cnblogs.com/yuecxl/p/2026032.html
Copyright © 2011-2022 走看看