有个疑问
查看原帖
有个疑问
773502
Billhqh9楼主2024/4/16 20:23

我用的是链式前向星存图,思路基本按这边题解的来。这段代码的问题好像是无法正常地存相邻的两层图之间的边,不知道为什么。再存相邻的两层图之间的边的时候最开始调用出的数组headhead的值都为00,而数组headhead的值前面都初始化为−1-1过了。奇怪的是,在后面存同一层图的边时,最开始调用出的数组headhead的值都正常地为−1-1.

#include<bits/stdc++.h>

using namespace std;

const int N=100003;
const int M=500003;
const int inf=0x8f8f8f8f;

struct node{
	int to,w,next;
}li[M*2*3+N*2];

int n,m,f[N],head[N*3],lit,x,y,z,dis[N*3],sf[N*3];

void add(int A,int B,int toward,int edge_weight);

int main(){

	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&f[i]);
		add(i,i+n,1,(-1)*f[i]),//第一层图到第二层图
		add(i+n,i+(n*2),1,f[i]);
		
		//初始化:
		dis[i]=dis[i+n]=dis[i+(n*2)]=inf,
		head[i]=head[i+n]=head[i+(n*2)]=-1,
		sf[i]=sf[i+n]=sf[i+(n*2)]=false;
	}
	
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&x,&y,&z);
		add(x,y,z,0),//第一层图
		add(x+n,y+n,z,0),//第二层图
		add(x+(n*2),y+(n*2),z,0);//第三层图
	}

	queue<int> q;
	q.push(1);
	dis[1]=0,sf[1]=true;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		sf[u]=false;
		for(int i=head[u];i!=-1;i=li[i].next)
			if(dis[li[i].to]<dis[u]+li[i].w){
				dis[li[i].to]=dis[u]+li[i].w;
				if(sf[li[i].to]==false){
					sf[li[i].to]=true;
					q.push(li[i].to);
				}
			}
	}
	
	if(dis[n*3]<=0)
		printf("0");
	else
		printf("%d",dis[n*3]);

	return 0;
	
}

void add(int a,int b,int td,int ew){
	
	li[++lit]=(node){b,ew,head[a]};
	head[a]=lit;
	
	if(td==2){
		li[++lit]=(node){a,ew,head[b]};
		head[b]=lit;
	}
	
}
2024/4/16 20:23
加载中...