floyd 。
现场写的死活过不去,后来看了看题解,和我的的还是有区别。
区别在,他正着记录路径。我逆着记录路径。。
结果我就错了/!!!!! 我擦简直了,我这样记录应该是没问题的呀。
思路: 就是跑一边floyd 更新的时候考虑如过到达一点其他路径如果前驱字典序小,就换。
然后 打印路径就好。
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
const int inf =100000000;
int n,x,y;
int ma[maxn][maxn];
int car[maxn];
int dis[maxn][maxn];
int pre[maxn][maxn];
void floyd(){
int i,j,k;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
if(ma[i][j]==-1) dis[i][j]=inf;
else dis[i][j]=ma[i][j];
pre[i][j]=j;
}
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
if(dis[i][k]+dis[k][j]+car[k]<=dis[i][j]){
if(dis[i][k]+dis[k][j]+car[k]<dis[i][j]){
dis[i][j]=dis[i][k]+dis[k][j]+car[k];
pre[i][j]=pre[i][k];
}
else if(dis[i][k]+dis[k][j]+car[k]==dis[i][j]&&pre[i][j]>pre[i][k]){
//dis[i][j]=dis[i][k]+dis[k][j]+car[k];
pre[i][j]=pre[i][k];
}
}
}
}
int main(){
stack<int >s;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%d",&ma[i][j]);
for(int i=1;i<=n;++i) scanf("%d",&car[i]);
floyd();
while(scanf("%d %d",&x,&y)){
while(!s.empty()) s.pop();
if(x==-1&&y==-1) break;
printf("From %d to %d :\n",x,y);
printf("Path: %d",x);
int u=x,v=y;
while(u!=v){
printf("-->%d",pre[u][v]);
u=pre[u][v];
}
printf("\nTotal cost : %d\n\n",dis[x][y]);
}
}
return 0;
}
现场崩掉的代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
const int inf =100000000;
int n,x,y;
int ma[maxn][maxn];
int car[maxn];
int dis[maxn][maxn];
int pre[maxn][maxn];
void floyd(){
int i,j,k;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
if(ma[i][j]==-1) dis[i][j]=inf;
else dis[i][j]=ma[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(dis[i][k]!=inf&&dis[k][j]!=inf&&dis[i][k]+dis[k][j]+car[k]<=dis[i][j]){
if(dis[i][k]+dis[k][j]+car[k]<dis[i][j]){
dis[i][j]=dis[i][k]+dis[k][j]+car[k];
pre[i][j]=pre[k][j];
}
else if(dis[i][k]+dis[k][j]+car[k]==dis[i][j]&&pre[i][j]>pre[k][j]){
//dis[i][j]=dis[i][k]+dis[k][j]+car[k];
pre[i][j]=pre[k][j];
}
}
}
}
int main(){
stack<int >s;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%d",&ma[i][j]);
for(int i=1;i<=n;++i) scanf("%d",&car[i]);
floyd();
while(scanf("%d %d",&x,&y)){
while(!s.empty()) s.pop();
if(x==-1&&y==-1) break;
printf("From %d to %d :\nPath: %d",x,y,x);
int t=y;
if(x!=y){
while(pre[x][t]!=x){
s.push(pre[x][t]);
t=pre[x][t];
}while(!s.empty()){
int q=s.top();
s.pop();
printf("-->%d",q);
}printf("-->%d",y);
}
printf("\nTotal cost : %d\n\n",dis[x][y]);
}
}
return 0;
}