Description
现在有个一个内部局域网络,里面有N台机器。为了某种安全原因的考虑,每两台机器之间的通讯都是经过加密的。由于不同机器之间传输的内容不同,所以他们通讯采用的加密级别也不大相同。不同的加密级别导致破解的难度不一样,越高的加密级别破解需要的时间也越多。如果我们获得了编号为i的机器的完全控制权,另外我们破解了机器i和机器j之间的加密信息,那么我们就得到了机器j的完全控制权。
现在你通过了某种手段入侵了1号机器,得到了这台机器的完全控制权。但是这个网络里面最重要的东西不在这台机器上,而在编号为N的机器上。由于需要破解加密信息才能控制其它机器,你又不想浪费太多时间在破解上,现在你来算算你至少需要多少时间才能得到编号为N的机器的完全控制权。
Input
输入的第一行是一个正整数N(0 < N <= 100),表示机器的数目。
输入的第二行开始到第N+1行,每行N个整数,第i+1行的第j个数字Tij表示破解机器i和机器j之间的加密算法所需要的时间,范围在[0..100,000]之间。另外Tij = Tji,Tii = 0。
Output
输出完全控制机器N的最少时间。
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
21
#include <iostream>
#define MAX 100000000
using namespace std;
int a[101][101],d[101],n;
bool b[101];
void Dijkstra()
{
int i,j,t,tmp;
for(i=1;i<=n;i++)
{
d[i]=a[1][i];
b[i]=false;
}
b[1]=true;
for(i=2;i<=n;i++)
{
t=1;
tmp=MAX;
for(j=2;j<=n;j++)
{
if(!b[j]&&d[j]<tmp)
{
t=j;
tmp=d[j];
}
}
if(t==n)
{
printf("%d\n",tmp);
return;
}
b[t]=true;
for(j=2;j<=n;j++)
{
if(!b[j]&&d[j]>tmp+a[t][j])
d[j]=tmp+a[t][j];
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
Dijkstra();
return 0;
}