ICode9

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

Saki也想要变强之Saki的一日一题(4)

2020-11-10 23:32:20  阅读:238  来源: 互联网

标签:Saki min int 存档 dst 变强 book die 想要


题目描述
菜月昴不想再死了,他想快点见到莎提拉,弄明白这一切到底是怎么回事。

整个死亡回归的系统可以被视为一张有n个存档点的有向图,存档点分别为1,2,3,…,n,现在菜月昴位于1号存档点,而他想到达n号存档点见莎提拉。

他的通过调查,找到了在存档点之间移动的所有路径,他可以在路径上移动到达另一个存档点,但是这是需要付出一定次数的死亡作为代价的。

死亡太痛苦了,他想少死几次,请问最少需要死几次他才能见到莎提拉。

输入
第一行包含一个正整数,为数据的组数T。

对于每组数据

第一行包含两个正整数n,含义见题目描述。

接下来包含n行,第i行包含n个正整数a1,a2,...,aj,...,an,aj表示从i号存档点抵达j号存档点需要付出的死亡次数代价。

输出
对于每组数据,输出一行,包含一个正整数,为莱月昴到达n号存档点最少的死亡次数。
代码:
include<stdio.h>
include<limits.h>
int die[1000][1000];

int disjstra(int n)
{
int i,dst[10000],book[1000],j,u,k,min;
for(i=1;i<=n;i++)
dst[i] = die[1][i];
for(i = 1; i <= n; i++)
book[i] = 0;
book[1] = 1;
for(i = 1; i <= n-1; i++){
min = INT_MAX;
for(j=1;j<=n;j++){
if(book[j] == 0 && dst[j] < min){
min = dst[j];
u = j;
}
}
book[u] = 1;
for(k = 1; k <= n; k++){
if(die[u][k] < INT_MAX && book[k] == 0){
if(dst[k] > dst[u] + die[u][k])
dst[k] = dst[u] + die[u][k];
}
}
}
return dst[n];
}
int main()
{
int t,i,n,j,k,ans;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&n);
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++){
scanf("%d",&die[j][k]);
}
}
ans=disjstra(n);
printf("%d\n",ans);

}

}
心得:
本质是求单源最短路径,将死亡次数看成边的权值即可,然后再用迪杰斯特拉算法即可,当然弗洛伊德算法也可,个人感觉还简单点。。。(由于上学期数据结构天天摸鱼,这几天狂补图的知识,数据结构没学好是我一生的痛~)

标签:Saki,min,int,存档,dst,变强,book,die,想要
来源: https://www.cnblogs.com/sakisaki/p/13956636.html

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

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

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

ICode9版权所有