洛谷P1690 贪婪的Copy 题解

题目:https://www.luogu.org/problemnew/show/P1690

分析:

这道题就是一道最短路的题目,因为看到数据范围:

n≤100n\leq100n100

所以考虑使用FloydFloydFloyd

我们先用O(n3)O(n^3)O(n3)的时间复杂度来跑一遍FloydFloydFloyd,然后考虑每个藏宝点,发现藏宝点p的范围:

p≤10p\leq10p10

我们可以考虑所有情况的穷举,所以说是一个数列的全排列,最多只需要枚举10!=3628800种情况即可。

推荐使用nextnextnext_permutation()permutation()permutation()函数.

此函数比如nextnextnext_permutation(t+1,t+1+p)permutation(t+1,t+1+p)permutation(t+1,t+1+p);

就是生成一下t这个数列从下标1到下标p的下一个全排列。

借此我们即可枚举所有情况。

下面见代码

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int f[105][105],t[15];
int main()
{
	int n;
	scanf("%d",&n);
	memset(f,0x3f3f3f3f,sizeof(f));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&f[i][j]);//存边
		}
	}
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				f[i][j]=fmin(f[i][j],f[i][k]+f[k][j]);
			}
		}
	}//Floyd最短路模板,不再赘述
	int p;
	scanf("%d",&p);
	for(int i=1;i<=p;i++)
	{
		scanf("%d",&t[i]);
	}
	sort(t+1,t+p+1);//首先排列一下,为从小到大排序,以此为起点
	int tmp=1,ans=2147483647;
	while(tmp!=0)//还有就是那个函数如果已经用过这种排列,它的返回值就是0
	{
		tmp=next_permutation(t+1,t+1+p);
		int temp=f[1][t[1]]+f[t[p]][n];//挑出特殊的
        for(int i=1;i<p;i++)
            temp+=f[t[i]][t[i+1]];//循环
        ans=fmin(ans,temp);//找最短距离
	}
	printf("%d",ans);
	return 0;//bye~
}
全部评论

相关推荐

11-13 10:17
门头沟学院 Java
昨天面美团,jvm,juc问的好深啊,感觉小林coding不太够喔,牛油们有没有什么推荐的八股网站嘛🕒&nbsp;岗位/面试时间👥&nbsp;面试题目🤔&nbsp;面试感受
明天不下雨了:小林Coding:https://xiaolincoding.com/ 全栈哥:https://www.pdai.tech/ Guide哥:https://javaguide.cn/ 秀哥:https://interviewguide.cn/ 沉默王二:https://javabetter.cn/home.html 磊哥:https://www.javacn.site/interview/basic/ 小傅哥:https://bugstack.cn/ 源码哥:https://doocs.github.io/source-code-hunter/#/ 各大厂的公众号技术文章和一些经典的书籍
面试太紧张了怎么办?
点赞 评论 收藏
分享
11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务