ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SSL_1731【非常计划】

2021-01-03 12:02:22  阅读:202  来源: 互联网

标签:1731 教主 城市 d% 花费 SSL int 计划 2010


非常计划

题目

教主开启了时光隧道来到了公元前30世纪(教主果然牛,大家卧倒= =),准备前往埃及。在他的地图上,有N个城市,我们已知他目前处在城市1,埃及在城市N. (XXX:埃及是一个城市么= =||)每一条道路都是单向的。我们还知道,从I城市到J城市需要D[I,J]的花费。教主想走一条从城市1到城市N花费最少的一条路,教主是一个喜欢思考的小盆友,他还希望你能告诉他花费最少的路径共有多少条。

Input

输入第一行为两个空格隔开的数N,E,表示这张地图里有多少个城市及有多少边的信息。
下面E行,每行三个数I、J、C,表示从I城市到J城市有道路相连且花费为C.(注意,数据提供的边信息可能会重复,不过保证I<>J,1<=I,J<=N)。

Output

包含两个数,分别是最少花费和花费最少的路径的总数。

Sample Input

5 4
1 5 4
1 2 2
2 5 2
4 1 1

Sample Output

4 2

解析

在dij的板子上加一句就能过
但是看到时间:
惨不忍睹的1946ms
想加一个堆优化,打开排名
什么?第四优解?我觉得够了(逃)

code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,x,y,z,k,a[2010][2010],w[2010],s[2010];
bool u[2010];
int main()
{
	memset(w,0x7f7f7f7f,sizeof(w));
	memset(a,0x7f7f7f7f,sizeof(a));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		a[x][y]=min(a[x][y],z);
	}
	w[1]=0;
	s[1]=1;
	for(int i=1;i<=n;i++)
	{
		k=0;
		for(int j=1;j<=n;j++)if(!u[j]&&w[j]<w[k])k=j;
		u[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!u[j]&&w[k]+a[k][j]<w[j])w[j]=w[k]+a[k][j],s[j]=s[k];//重置
			else if(!u[j]&&w[k]+a[k][j]==w[j])s[j]+=s[k];//增加
		}
	}
	if(w[n]==-16843010)
	{
		printf("No answer");//居然还真有这个点
		return 0;
	}
	printf("%d %d",w[n],s[n]);//输出
	return 0;
}

标签:1731,教主,城市,d%,花费,SSL,int,计划,2010
来源: https://blog.csdn.net/zhanglili1597895/article/details/112132999

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有