您的位置:首页 > 其它

ZOJ 1082 (最短路径 Floyed)

2012-08-14 18:43 239 查看
这几天的刷题速度是极慢的,  面对zoj的一堆蚂蚁大小的英文题,  总觉得心烦气躁, 刚吃晚饭,把WA的再来改改,  随便一改, 对了,  因为我之前一题Floyed更新距离那一块我顺便做了双向的更新   即反方向的也写上去了,  没错,    不过这题, 我改之前错的, 改之后意外的对了    于是附上代码

//这题的思路 主要就是从枚举每一个点 从任何一个点出发 看到达所有点所花的最短时间,才开始我想的有些复杂,认为无法在同一个时间传递给多人,
//后来发现 不存在这个问题, 只要在每次运算找到最大的一个距离 , 然后在全局的枚举中 找到一个最短的距离 就是结果了。基本都是套的模版没有其他难度
#include<stdio.h>
const int maxn=101;
const int INF=1000000000;
void Floyed(int n,int map[][maxn],int dist[][maxn],int pre[][maxn])
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
dist[i][j]=map[i][j];
pre[i][j]=i;
}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][j]>dist[i][k]+dist[k][j]){
dist[i][j]=dist[i][k]+dist[k][j];
pre[i][j]=pre[k][j];
}
}
int main()
{
int n,map[maxn][maxn],dist[maxn][maxn],pre[maxn][maxn];
int t;
int i,j,ti;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) map[i][j]=INF;
else map[i][j]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&j,&ti);
map[i][j]=ti;
}
}
if(n==1){
printf("1 0\n");
continue;
}
Floyed(n,map,dist,pre);
int tmp=0;
int tmpmin=INF;
for(i=1;i<=n;i++)
{
int tmpmax=-1;
for(j=1;j<=n;j++)
{
if(dist[i][j]>tmpmax){
tmpmax=dist[i][j];
}
}
if(tmpmax!=INF&&tmpmax<tmpmin){
tmp=i;
tmpmin=tmpmax;
}
}
if(tmp)
printf("%d %d\n",tmp,tmpmin);
else printf("disjoint\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: