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;
}
//这题的思路 主要就是从枚举每一个点 从任何一个点出发 看到达所有点所花的最短时间,才开始我想的有些复杂,认为无法在同一个时间传递给多人,
//后来发现 不存在这个问题, 只要在每次运算找到最大的一个距离 , 然后在全局的枚举中 找到一个最短的距离 就是结果了。基本都是套的模版没有其他难度
#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;
}
相关文章推荐
- ZOJ 1082 dijkstra 最短路径
- zoj 1082 Stockbroker Grapevine(第一次写最短路径~~嘻嘻~)
- ZOJ-1082-Stockbroker Grapevine(最短路径)
- BellmanFord单源最短路径路径算法差分约束系统ZOJ–2770
- 最短路径问题Floyed-Warshall(图…
- zoj 3946 Highway Project(最短路径)
- 数据结构_图_最短路径_弗洛伊德(Floyed)算法
- ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)
- ZOJ 2760--How Many Shortest Path【dinic最大流 && 最短路构图 && 求最短路径的条数】
- ZOJ - 2750 Idiomatic Phrases Game (最短路径)
- poj 1125 (floyed 最短路径)
- 作业-最短路径问题(floyed.cpp dijkstra.cpp)
- 【图论】【最短路径模板+邻接表】【Floyed+Dijsktra+Bellman-Ford+SPFA】【最短路算法对比分析】
- floyed任意两点间最短路径
- zoj 1298 Domino Effect (最短路径)
- zoj 1298 Domino Effect(最短路径)
- ZOJ 2864 多条最短路径
- 多源最短路径+源码<floyed>
- ZOJ 3166题解 最短路径之Floyd算法
- POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)