1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 #include<map> 8 using namespace std; 9 const int ma1=100010,ma2=500010,maxn=2147483647; 10 typedef pair<int ,int > node; 11 struct Edge 12 { 13 int next,to; 14 } E1[ma2],E2[ma2]; 15 int V[ma1]; 16 int num_Edge1,Head1[ma1],Min[ma1],vis1[ma1]; 17 int Max[ma1],num_Edge2,Head2[ma1],vis2[ma1]; 18 int N,M,Ans; 19 map<pair<int,int>,bool>Map; 20 inline int Read(void) 21 { 22 int w=0,x=0; 23 char ch=0; 24 while(!isdigit(ch)) w|=ch==‘-‘,ch=getchar(); 25 while(isdigit(ch)) x=x*10+(ch^48),ch=getchar(); 26 return w?-x:x; 27 } 28 void Add_Edge1(int from,int to) 29 { 30 ++num_Edge1; 31 E1[num_Edge1].next =Head1[from]; 32 E1[num_Edge1].to =to; 33 Head1[from]=num_Edge1; 34 } 35 void Add_Edge2(int from,int to) 36 { 37 ++num_Edge2; 38 E2[num_Edge2].next =Head2[from]; 39 E2[num_Edge2].to =to; 40 Head2[from]=num_Edge2; 41 } 42 inline void SPFA1(void)// 寻找路径上最小价格点(从源点出发) 43 { 44 queue<int >Q1; 45 Min[1]=V[1]; 46 Q1.push(1) ; 47 while(!Q1.empty() ) 48 { 49 int u=Q1.front(); 50 Q1.pop() ; 51 vis1[u]=0; //出队标记 52 for(int i=Head1[u]; i; i=E1[i].next ) 53 { 54 int v=E1[i].to ,t=min(Min[u],V[v]); 55 if(Min[v]>t) 56 { 57 Min[v]=t; 58 if(!vis1[v]) 59 { 60 vis1[v]=1; 61 Q1.push(v) ; 62 } 63 } 64 } 65 } 66 } 67 inline void SPFA2(void)//寻找从N点出发所能到达的最大价格处 68 { 69 queue<int >Q2; 70 Q2.push(N) ; 71 while(!Q2.empty() ) 72 { 73 int u=Q2.front(); 74 Q2.pop() ; 75 vis2[u]=0; //出队标记 76 for(int i=Head2[u]; i; i=E2[i].next ) 77 { 78 int v=E2[i].to ,t=max(Max[u],V[v]); 79 if(Max[v]<t) 80 { 81 Max[v]=t; 82 if(!vis2[v]) 83 { 84 vis2[v]=1; 85 Q2.push(v) ; 86 } 87 } 88 } 89 } 90 } 91 inline void Write() 92 { 93 N=Read(),M=Read() ; 94 for(int i=1; i<=N; ++i) Min[i]=maxn; 95 for(int i=1; i<=N; ++i) V[i]=Read(); 96 for(int i=1; i<=M; ++i) //建图 97 { 98 int u=Read(),v=Read(),m=Read(); 99 if(m==1) 100 { 101 Add_Edge1(u,v);//正图 102 Add_Edge2(v,u);//反图 103 } 104 else 105 { 106 Add_Edge1(v,u);//正图 107 Add_Edge1(u,v); 108 Add_Edge2(v,u);//反图 109 Add_Edge2(u,v); 110 } 111 } 112 } 113 int main(void) 114 { 115 Write(); 116 SPFA1(); 117 SPFA2(); 118 for(int i=1; i<=N; ++i)//计算最大差值 119 { 120 if(Min[i]!=maxn&&Max[i]!=0)//保证此点在从1到N的路径上 121 Ans=max(Max[i]-Min[i],Ans); 122 } 123 printf("%d",Ans); 124 return 0; 125 }
原文:https://www.cnblogs.com/Blacktears/p/11503189.html