我不理解……
查看原帖
我不理解……
210854
guojunwei楼主2022/6/14 15:51

SP同样的题,为什么SP过了,UVA没过……

代码如下:

#include<iostream>
#include<cstdio>
#include<deque>
#include<cstring>
using namespace std;
const int N=5e5+11;
int maxn=0;
int ver[N],edge[N],nxt[N],hd[N],tot;
int dis[N],vis[N],ti[N];
deque<int> deq;
void init(){
	memset(hd,0,sizeof(hd));
	tot=0;
	maxn=0;
	memset(dis,-0x7f,sizeof(dis));
	memset(ti,0,sizeof(ti));
}
void ins(int x,int y,int z){
	ver[++tot]=y;
	edge[tot]=z;
	nxt[tot]=hd[x];
	hd[x]=tot;
}
int SPFA(int st){
	dis[st]=0;
	deq.push_back(st);
	vis[st]=1;
	while(!deq.empty()){
		int x=deq.front();
		deq.pop_front();
		vis[x]=0;
		ti[x]++;
		if(ti[x]>maxn) return 1;
		for(int i=hd[x];i;i=nxt[i]){
			int y=ver[i],z=edge[i];
			if(dis[x]+z>dis[y]){
				dis[y]=dis[x]+z;
				if(!vis[y]){
					vis[y]=1;
					if(!deq.empty() && dis[y]>dis[deq.front()]) deq.push_front(y);
					else deq.push_back(y);
				}
			}
		}
	}
	return dis[maxn];
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		init();
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			maxn=max(maxn,max(x,y));
			ins(x-1,y,z);
		}
		for(int i=0;i<=maxn;i++){
			if(i!=0) ins(i-1,i,0);
			if(i!=maxn) ins(i+1,i,-1);
		}
		for(int i=1;i<=maxn;i++){
			ins(0,i,0);
		}
		if(T>1) printf("%d\n\n",SPFA(0));
		else printf("%d",SPFA(0));
	}
	return 0;
}
2022/6/14 15:51
加载中...