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;
    }
    
  • 相关阅读:
    HTTP协议详情
    HTTP入门
    DNS vs CDN
    TCP/IP协议和互联网协议群
    常用docker镜像
    linq to sql 把数据库连接字段写入配置文件
    微信开发--one.微信平台验证
    项目--ajax上传文件(本次是图片)(.net)
    项目--Repeater嵌套横向显示
    项目--物流查询实现
  • 原文地址:https://www.cnblogs.com/yuecxl/p/2026032.html
Copyright © 2011-2022 走看看