比赛 |
至少完成十道练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
最优贸易 |
最终得分 |
100 |
用户昵称 |
Mealy |
运行时间 |
0.268 s |
代码语言 |
C++ |
内存使用 |
3.75 MiB |
提交时间 |
2017-05-22 19:13:43 |
显示代码纯文本
//406
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
const int nmax=100010;
const int INF=110;
using namespace std;
vector<int > G[nmax];
vector<int > opG[nmax];
int N,M;
int val[nmax]={0};
int Min[nmax]={0};
int Max[nmax]={0};
int x,y,z;
int ans;
void PreDo(){
ans=0;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++){
scanf("%d",&val[i]);
Min[i]=INF;
Max[i]=0;
}
for(int i=1;i<=M;i++){
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(y);
opG[y].push_back(x);
if(z==2){
G[y].push_back(x);
opG[x].push_back(y);
}
}
}
void SPFA(){
queue<int > Q;
bool inqueue[nmax];
memset(inqueue,0,sizeof(inqueue));
Q.push(1);
inqueue[1]=1;
Min[1]=val[1];
while(!Q.empty()){
int tmpx=Q.front();
Q.pop();
inqueue[tmpx]=0;
for(int i=0;i<G[tmpx].size();i++){
int v=G[tmpx][i];
if(Min[v]>Min[tmpx]||Min[v]>val[v]){
Min[v]=min(Min[tmpx],val[v]);
if(!inqueue[v]){
Q.push(v);
inqueue[v]=1;
}
}
}
}
}
void opSPFA(){
queue<int > Q;
bool inqueue[nmax];
ans=max(ans,Max[N]-Min[N]);
memset(inqueue,0,sizeof(inqueue));
Q.push(N);
inqueue[N]=1;
Max[N]=val[N];
while(!Q.empty()){
int tmpx=Q.front();
Q.pop();
inqueue[tmpx]=0;
for(int i=0;i<opG[tmpx].size();i++){
int v=opG[tmpx][i];
if(Max[v]<Max[tmpx]||val[v]>Max[v]){
Max[v]=max(Max[tmpx],val[v]);
ans=max(Max[v]-Min[v],ans);
if(!inqueue[v]){
Q.push(v);
inqueue[v]=1;
}
}
}
}
printf("%d\n",ans);
/*
for(int i=1;i<=N;i++){
printf("%d %d\n",Min[i],Max[i]);
}
*/
}
int main(){
freopen("trade.in","r",stdin);
freopen("trade.out","w",stdout);
PreDo();
SPFA();
opSPFA();
return 0;
}