Saki也想要变强之Saki的一日一题(4)
作者:互联网
题目描述
菜月昴不想再死了,他想快点见到莎提拉,弄明白这一切到底是怎么回事。
整个死亡回归的系统可以被视为一张有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