noip2009 t3
include
include
include
include
include
define M 5000050
define N 1000050
using namespace std;
int ans=0,n,m,tot,tot2,ver[M],ver2[M],head[N],head2[M],Next[N],Next2[N],d[N],d2[N],pre[N];
bool v[N];
queue
void add(int x,int y){
ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void add2(int x,int y){
ver2[++tot2]=y,Next2[tot2]=head2[x],head2[x]=tot2;
}
/*
memset(Forward,0x3f,sizeof(Forward));
// memset(Reverse,0,sizeof(Reverse));
Forward[1]=Price[1];
q.push(1);
while(q.size()){
x=q.front();q.pop();
v[x]=false;
for(int j=head[x];j;j=nex[j]){
y=v[j];
if(Forward[y]>min(Forward[x],Price[y])){
Forward[y]=Forward[x]<Price[y]?Forward[x]:Price[y];
if(!vis[y])q.push(y);
}
}
}
*/
void spfa(){
memset(d,0x3f,sizeof(d));
//for(int i=1;i<=n;i++) cerr<<d[i]<<endl;
//memset(v,0,sizeof(v));
d[1]=pre[1];
q.push(1);
while(q.size()){
int x=q.front();q.pop();
ver[x]=0;
for(int i=head[x];i;i=Next[i]){
// cerr<<i<<endl;
int y=ver[i];
if(d[y]>min(pre[y],d[x])){
d[y]=min(d[x],pre[y]);
//if(!v[y])
q.push(y),v[y]=1;
}}
}
// cerr<<x;
}
/*
Reverse[n]=Price[n];
q.push(n);
while(q.size()){
x=q.front();q.pop();
V[x]=false;
for(int j=Head[x];j;j=Nex[j]){
y=V[j];
if(Reverse[y]<max(Reverse[x],Price[y])){
Reverse[y]=Reverse[x]<Price[y]?Price[y]:Reverse[x];
if(!vis[y])q.push(y);
}
}
}
*/
void spfa2(){
// memset(d,-1,sizeof(d2));
//memset(v,0,sizeof(v));
d2[n]=pre[n];
q.push(n);
while(q.size()){
int x=q.front();q.pop();
ver[x]=0;
for(int i=head2[x];i;i=Next2[i]){
//cerr<<i<<endl;
int y=ver2[i];
if(d2[y]<max(pre[y],d2[x])){
d2[y]=max(d2[x],pre[y]);
// if(!v[y])
q.push(y),v[y]=1;
}}
}
// cerr<<x;
}
int main(){
cin>>n>>m;
memset(pre,0,sizeof pre);
for(int i=1;i<=n;i++)
//cin>>pre[i];
scanf("%d",&pre[i]);
//for(int i=1;i<=n;i++) cerr<<pre[i]<<endl;
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z==1)
{add(x,y);add2(y,x);}
else {
add(x,y);add(y,x);
add2(y,x);add2(x,y);
}
}
spfa();
spfa2();
for(int i=1;i<=n;i++) cerr<<d[i]<<endl;cerr<<endl;for(int i=1;i<=n;++i) cerr<<d2[i]<<endl;//for(int i=1;i<=n;++i) cerr<<pre[i]<<endl;
int ans = 0; for(int i = 1;i<=n;++i) ans=max(ans,d2[i]-d[i]);
printf("%d\n",ans);
return 0;
}
能力范围内数组开大
最短路INF
最长路0,而不是-1

浙公网安备 33010602011771号