PS:是我同学的代码
#include<bits/stdc++.h>
using namespace std;
//
int n,m,k,a[100001],head[100001],b[1000001][3]/*0:去的点 1:距离 2:下一个数据下标(模拟结构体、链表储存)*/,x,y,z,l,la;
void linkd(int x1){
if(b[x1][0]==x){
b[x1][1]=min(b[x1][1],z);
}else if(b[x1][2]==-1){
b[++l][0]=y;
b[l][1]=z;
b[x1][2]=l;
}else{
linkd(b[x1][2]);
}
}
int main(){
cin>>n>>m>>k;
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
for(int i=0;i<m;i++){
scanf("%d %d %d",&x,&y,&z);
if(x==y) continue;
if(head[x]==0){
head[x]=++l;
b[l][0]=y;
b[l][1]=z;
}else{
linkd(head[x]);
}
if(x==k){
a[y]=l;
la=l;
}
}
x=head[k];
//x是k点目前要去到地方的第一个数据下标
while(x!=0){
y=b[x][0];
//y是k点要去到地方的点
z=head[y];
//z是k点以y为起点的要去到地方的数据下标
y=b[z][0];
//y是k点以y为起点的要去到地方的点
while(z!=0){
//看有没有更短路
if(a[y]==-1){
//加A
a[y]=++l;
b[l][0]=y;
b[l][1]=min(b[l][1]==-1 ? 0x7fffffff : b[l][1],b[x][1]+b[z][1]);
b[la][2]=l;
la=l;
}else{
b[a[y]][1]=min(b[a[y]][1]==-1 ? 0x7fffffff : b[a[y]][1],b[x][1]+b[z][1]);
}
z=b[z][2];
y=b[z][0];
//下一个可以去的地方
}
x=b[x][2];
//到下一个数据下标
}
for(int i=1;i<=n;i++){
if(i==k)cout<<0<<" ";
else cout<<b[a[i]][1]<<" ";
}
return 0;
}
能过洛谷单源最短路径弱化版的样例以及节点#1,但是剩下节点均WA。
下载数据后发现节点#2的第二个输出就错了,85输出120.但是样例过大,无法找到错因,能否那位Dalao给出Hack数据或者不正确证明???