the reason of failure:1、第一次的时候,给输入input的i<n,应该是i<=n。
2、第二次是由于输入的少一个%d。
how to solve:修改
question:
where is difficult:基础
key point:把每个边都初始化为-1,然后把所有题目给的能走的边储存。通过三层循环,找出到达某个结点的最短路径,没找到一个就代替之前的路径。
即本来输入的是 1 3 5 意思是1到3的权值为5,如果有1-4-6-3,的权值为3,那么map[1][3]就会被替代成一个1到3的最短权值也就是3。floyed是将map全部替换。
输入样例:
4 4 //第一个4表示有4个点,第二个4表示下面有4个权需要输入,最后一行1 4 表示从1到4的最短路径
1 3 1
3 2 1
2 4 1
1 4 20
1 4
输出样例:
3
源码:
#include <iostream>
#define MAXN 100
using namespace std;
int map[MAXN][MAXN],n,m;
void input(void){
int i,j,k;
int a,b,c;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=-1; //把图初始化
for(k=1;k<=m;k++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;} //把可以同的图连接起来
}
void floyed(void){
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]!=-1&&map[j][k]!=-1)
if(map[i][j]+map[j][k]<map[i][k]||map[i][k]==-1){
map[i][k]=map[i][j]+map[j][k];
}
}
int main(){
int a,b;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&m)==2&&n&&m){
input();
floyed();
scanf("%d%d",&a,&b);
printf("%d",map[a][b]);
}
return 0;
}