关于自创最短路径算法的亿点XOR
  • 板块学术版
  • 楼主Moeebius
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/12/4 16:02
  • 上次更新2023/11/3 22:57:30
查看原帖
关于自创最短路径算法的亿点XOR
356003
Moeebius楼主2021/12/4 16:02

PS:是我同学的代码

Code

#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数据或者不正确证明???

2021/12/4 16:02
加载中...