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;
}