Chanyuenlam 2017-12-29 02:00 采纳率: 0%
浏览 1169
已结题

求救贴 女大学生卡死在学校oj题上 求助求助 Floyd-Warshall算法

题目


Description
Floyd-Warshall算法是求一个图中任意两点之间的最短路径长度的算法。

给出一个有向图,请计算图中任意两个顶点之间的最短路径,及其长度。

Input
单测试用例。

第一行是该有向图的 顶点数n ( 0 < n < 500 )(注:图有n个顶点,首个顶点的编号是0。 )

第二行是该有向图的 边数e ( 0 < e < n×n )

接下来e行,每行三个整数 i 、j 和 k,表示 顶点i 到顶点j 有一条弧,长度为k。 ( 0 ≤ i, j < n )

(注:输入数据中不含 自环 。)

接下来一个正整数Q,表示有Q个询问。

接下来Q行,每行两个非负整数u和v,表示询问 顶点u 到 顶点v 的最短路长度,以及该最短路径是怎么走的。

Output
对每个询问输出三行。

第一行是一个整数,表示顶点u到顶点v的最短路长度。如果不可达,输出INF ,且不用输出第二行。如果路径长度为0,也不用输出第二行。

第二行是若干个整数,每个整数后面跟一个空格,表示顶点u 到顶点v 的最短路的顶点序列。

第三行是一个空行,仅起分隔作用。

Sample Input
3
5
0 1 4
0 2 11
1 0 6
1 2 2
2 0 3
3
0 2
0 1
1 0

Sample Output
6
0 1 2

4
0 1

5
1 2 0

Hint
样例如下图所示

1397_1.png

注意:本题是special judge,但validator没有写得很完美。你的代码输出时如果没有间隔的空行,PE会判为WA


以下是本人的代码
#include
#include
#define MAX 505
typedef struct
{
int edges[MAX][MAX];
int n,e;
}MGraph;
MGraph G;
int D[MAX][MAX],path[MAX][MAX];
int inf=99999999;
void Path(int u,int v)
{
int k;
k=path[u][v];
if(k==-1)
return ;
Path(u,k);
printf("%d ",k);
Path(k,v);
}

void Dispath(int u,int v)
{
if(D[u][v]==inf||D[u][v]==0)
{
printf("INF\n");
}
else
{
printf("%d\n",D[u][v]);
printf("%d ",u);
Path(u,v);
printf("%d\n",v);
}

}
void Floyd(MGraph G)
{
int Q,u,v;
int i,j,k;
for(i=0;i {
for(j=0;j {
D[i][j]=G.edges[i][j];
path[i][j]=-1;
}
}
/*for(i=0;i {
for(j=0;j printf("%d ",D[i][j]);
printf("\n");
}
printf("\n");*/
for(k=0;k {
for(i=0;i {
for(j=0;j if(D[i][k](D[i][k]+D[k][j]))
{
D[i][j]=D[i][k]+D[k][j];
//printf("%d ",D[i][j]);
path[i][j]=k;
}}
}

/*for(i=0;i<G.n;i++)
{
    for(j=0;j<G.n;j++)
        printf("%d ",D[i][j]);
    printf("\n");
}
printf("\n");
for(i=0;i<G.n;i++)
{
    for(j=0;j<G.n;j++)
        printf("%d ",path[i][j]);
    printf("\n");
}
system("pause");*/

scanf("%d",&Q);
for(i=0;i<Q;i++)
{
    scanf("%d %d",&u,&v);
    Dispath(u,v);
    printf("\n");
}

}
int main()
{
int i,j,k,t;
scanf("%d",&G.n);
scanf("%d",&G.e);
for(i=0;i<G.n;i++)/////////////ÁÚ½Ó¾ØÕó³õʼ»¯
for(j=0;j<G.n;j++)
{
if(i==j)
G.edges[i][j]=0;
else
G.edges[i][j]=inf;
//printf("%d ",G.edges[i][j]);

    }
//printf("\n");
//printf("%d",G.e);
//printf("%d\n",INF);
for(t=0;t<G.e;t++)
{
    //system("pause");
    scanf("%d %d %d",&i,&j,&k);
    G.edges[i][j]=k;

}
/*for(i=0;i<G.n;i++)
{
    for(j=0;j<G.n;j++)
        printf("%d ",G.edges[i][j]);
    printf("\n");
}
printf("\n");*/
//printf("text\n");
Floyd(G);

return 0;

}

  • 写回答

4条回答 默认 最新

  • devmiao 2017-12-29 03:43
    关注

    女大学生?你男票呢,不能帮你?姐姐是可怜你,给你个链接,自己看吧 http://blog.csdn.net/ll365594480/article/details/6792096

    评论

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建