hdu3790 最短路径问题 (dijkstra,双关键值最短路)

本文介绍了一个最短路径问题,涉及图论中的节点、边、距离和成本等概念。任务是找到从起点到终点的最短路径及最小花费,并提供了一段实现该算法的C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19606    Accepted Submission(s): 5837


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 

Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 

Output
输出 一行有两个数, 最短距离及其花费。
 

Sample Input
  
3 2 1 2 5 6 2 3 4 5 1 3 0 0
 

Sample Output
  
9 11
 

Source
 

Recommend
notonlysuccess   |   We have carefully selected several similar problems for you:   1142  1548  1598  1596  1162 
 


代码:

#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=1e3;
struct tnode{
	int point;
	int distance;
	int price;
	tnode *next;
}*h[maxn+5];
int n,s,e,dist[maxn+5],cost[maxn+5];
bool used[maxn+5];

void add(int a,int b,int d,int p)
{
  tnode *q=new tnode;
  (*q).point=b;
  (*q).distance=d;
  (*q).price=p;
  (*q).next=h[a],h[a]=q;
}

void dijkstra()
{
  memset(dist,10,sizeof(dist)),dist[s]=0;
  memset(cost,10,sizeof(cost)),cost[s]=0;
  memset(used,0,sizeof(used));
  
  int i,j,k,x;tnode *p;
  for(i=1;i<n;i++)
    {
      for(k=0,j=1;j<=n;j++)
        {
          if(used[j] || dist[j]>dist[k])continue;
          if(dist[j]<dist[k])goto d1;
          if(cost[j]<cost[k])d1:k=j;
		}
	  if(k==e)return;
	  used[k]=1;
	  for(p=h[k];p;p=(*p).next)
	    {
	      x=dist[k]+(*p).distance;
	      if(dist[(*p).point]<x)continue;
	      if(dist[(*p).point]>x)
		    {
			  dist[(*p).point]=x;
			  cost[(*p).point]=cost[k]+(*p).price;
			  continue;  
			}
	      x=cost[k]+(*p).price;
	      if(cost[(*p).point]>x)cost[(*p).point]=x;
		}
	}
}

int main()
{
  //freopen("1.in","r",stdin);
  
  int m,i,a,b,d,p;
  while(scanf("%d%d",&n,&m),n)
    {
      for(i=1;i<=n;i++)h[i]=NULL;
      while(m--)
        {
          scanf("%d%d%d%d",&a,&b,&d,&p);
          add(a,b,d,p),add(b,a,d,p);
		}
	  scanf("%d%d",&s,&e),dijkstra();
	  printf("%d %d\n",dist[e],cost[e]);
	}
  return 0;
}



内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值