记录编号 | 194109 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [NOIP 2009]最优贸易 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 1.735 s | ||
提交时间 | 2015-10-15 22:12:27 | 内存使用 | 14.79 MiB | ||
#include<cstdio> #include<deque> #include<iostream> #include<cmath> #include<cstring> using namespace std; const int SIZEN=100010,INF=0x7fffffff/2; deque<int> s[2][SIZEN]; int N,M,val[SIZEN],m[2][SIZEN]; void read() { scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) scanf("%d",&val[i]); int fr,to,p; for(int i=1;i<=M;i++) { scanf("%d%d%d",&fr,&to,&p); s[0][fr].push_back(to);s[1][to].push_back(fr); if(p==2) s[0][to].push_back(fr),s[1][fr].push_back(to); } } void spfa(int x,bool t) { deque<int> Q; Q.push_back(x); for(int i=1;i<=N;i++) { if(t==0) m[t][i]=INF; else m[t][i]=0; } m[t][x]=val[x]; bool inq[SIZEN]={0}; inq[x]=1; while(!Q.empty()) { int x=Q.front();Q.pop_front();inq[x]=0; for(int i=0;i<s[t][x].size();i++) { int v=s[t][x][i]; if(t==1&&(m[t][x]>m[t][v]||val[v]>m[t][v])) { m[t][v]=max(m[t][x],val[v]); if(!inq[v]) { inq[v]=1; Q.push_back(v); } } if(t==0&&(m[t][x]<m[t][v]||val[v]<m[t][v])) { m[t][v]=min(m[t][x],val[v]); if(!inq[v]) { inq[v]=1; Q.push_back(v); } } } } } int main() { freopen("trade.in","r",stdin); freopen("trade.out","w",stdout); read(); spfa(1,0); //for(int i=1;i<=N;i++) cout<<m[0][i]<<" "; //cout<<endl; spfa(N,1); int ans=0; for(int i=1;i<=N;i++) ans=max(m[1][i]-m[0][i],ans); printf("%d",ans); return 0; }