为什么这个题dijkstra还是能过?
  • 板块P1807 最长路
  • 楼主ACRUSHj
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/16 19:32
  • 上次更新2023/11/2 13:24:52
查看原帖
为什么这个题dijkstra还是能过?
925506
ACRUSHj楼主2023/10/16 19:32

首先有负权,其次求的是最长路。

这里放一下我侏罗纪时期写的使山代码:

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
const int N=1510,M=50100;
int n,m,g,k;
int d[N],nbs[N];
bool v[N];
struct edge{
	int ed,next;
	int w;
}a[M];
void add(int x,int y,int z){
	g++;
	a[g].ed=y;
	a[g].next=nbs[x];
	a[g].w=z;
	nbs[x]=g;
	return;
} 
void init(){
	int fr,to,len;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&fr,&to,&len);
		add(fr,to,len);
	}
	return;
}
void dijk(){
	for(int i=1;i<=n;i++)
	d[i]=-inf;
	d[1]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
			if(!v[j]){
				k=j;
				break;
			}
		v[k]=1;
		int x=nbs[k];
		while(x){
			if(!v[a[x].ed])
			d[a[x].ed]=max(d[a[x].ed],d[k]+a[x].w);
			x=a[x].next;
		}
	}
}
signed main(){
	init();
	dijk();
	if(d[n]==-inf)printf("-1");
	else printf("%d",d[n]);
	return 0;
}
2023/10/16 19:32
加载中...