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];
queueq;
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

posted @ 2018-10-26 10:23  CrazyBoyM  阅读(72)  评论(0)    收藏  举报