题目大意:
N个处理器之前要传递信息,给出一个三角矩阵,记录d[i][j]距离,若为x则表示不能传递,问从第一个信息处理器到其他所有处理器距离的最大值。
(N<=100)
思路一:此题为典型的单源最短路。考虑到数据比较小我们可以直接Floyd,最后更新maxx即为答案。如下代码。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100000
using namespace std;
int n,edge[110][110];
int change(char* str)
{
int res=0;
while(*str)
{
res=res*10+*str++ -'0';
}
return res;
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
edge[i][j]=MAXN;
}
}
void floyd()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(edge[i][j]<MAXN&&edge[i][k]<MAXN)
edge[j][k]=min(edge[j][k],edge[i][j]+edge[i][k]);
}
}
int main()
{
char str[300];
int dis;
cin>>n;
init();
for(int i=1;i<=n;i++)
{
edge[i][i]=0;
for(int j=1;j<i;j++)
{
scanf("%s",str);
if(str[0]=='x')edge[i][j]=edge[j][i]=MAXN;
else edge[i][j]=edge[j][i]=change(str);
}
}
floyd();
int maxx=-1;
for(int i=2;i<=n;i++)
maxx=max(edge[1][i],maxx);
cout<<maxx;
//while(1);
return 0;
}
思路二:也可中规中矩地选择代码略长一点的Dijkstra,如下代码。
</pre><pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100000
using namespace std;
int n,edge[110][110];
int v[110],d[110],pos=-1,temd=-1,temp=-1,cnt=0;
int change(char* str)
{
int res=0;
while(*str)
{
res=res*10+*str++ -'0';
}
return res;
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
edge[i][j]=-1;
}
for(int i=1;i<=n;i++)
{
v[i]=false;
d[i]=MAXN;
}
}
void dij(int s)
{
memset(v,0,sizeof(v));
d[s]=0;
v[s]=true;
pos=s;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!v[j]&&edge[pos][j]!=-1&&d[pos]+edge[pos][j]<d[j])
{
d[j]=d[pos]+edge[pos][j];
}
}
temd=MAXN;
for(int j=1;j<=n;j++)
{
if(!v[j]&&d[j]<temd)
{
temd=d[j];
temp=j;
}
}
v[temp]=true;
pos=temp;
}
}
int main()
{
char str[300];
int dis;
cin>>n;
init();
for(int i=1;i<=n;i++)
{
edge[i][i]=0;
for(int j=1;j<i;j++)
{
scanf("%s",str);
if(str[0]=='x')edge[i][j]=edge[j][i]=-1;
else edge[i][j]=edge[j][i]=change(str);
}
}
dij(1);
int maxx=-1;
for(int i=2;i<=n;i++)
{
if(d[i]>maxx)
{
maxx=d[i];
}
}
cout<<maxx;
//while(1);
return 0;
}