洛谷1037 NOIP2009 最优贸易
2017-11-08 16:53
267 查看
好吧 我太zz了 居然花了3个小时 还是找了一组大数据测的 wa无数次
有一个很简单的思路 就是正反跑2遍spfa存最大值和最小值 每个点做差取max 这个想法好像比较(特别)好想 也很好实现
可是我这个蒟蒻先写了个tarjan 然后就一直顺着这个思路 陷入深坑 不过跑完灰常快(O(∩_∩)O哈哈~) 我的思路是先缩点 然后建反向边跑一边 看那些点是可以到的 然后正向建边dfs 当然得剪枝啦 我这里t了好几次
具体的看代码吧 考前切切noip 顺带把变量名设成各位dalao膜一膜
有一个很简单的思路 就是正反跑2遍spfa存最大值和最小值 每个点做差取max 这个想法好像比较(特别)好想 也很好实现
可是我这个蒟蒻先写了个tarjan 然后就一直顺着这个思路 陷入深坑 不过跑完灰常快(O(∩_∩)O哈哈~) 我的思路是先缩点 然后建反向边跑一边 看那些点是可以到的 然后正向建边dfs 当然得剪枝啦 我这里t了好几次
具体的看代码吧 考前切切noip 顺带把变量名设成各位dalao膜一膜
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,ans,sum,cnt,top,tot,dfn ,low ,head ,bel ,mn ,mx ,in ,v ,a[5*N],b[5*N],c[5*N],amaz ; bool vis ,to ; struct Edge{ int v,nxt; }e[N*2]; void add(int u,int v){ e[++tot].v=v,e[tot].nxt=head[u],head[u]=tot; } void fc(int x){ to[x]=1;vis[x]=1; for(int i=head[x];i;i=e[i].nxt){ int j=e[i].v; if(!vis[j]) fc(j); } } void dfs(int x,int need,int zjq){ // bug(need); if(x==bel[1]) ans=max(ans,zjq);//,cout<<x<<" "<<need<<" "<<zjq<<endl; else for(int i=head[x];i;i=e[i].nxt){ int j=e[i].v; int wly=max(need,mx[j]); if(amaz[j]<wly){ amaz[j]=wly; dfs(j,wly,max(zjq,wly-mn[j])); } else if(to[j]){ //cout<<x<<" "<<need<<" "<<zjq<<endl; ans=max(ans,zjq); } } } void tarjan(int x){ dfn[x]=low[x]=++cnt; vis[x]=1;in[++top]=x; for(int i=head[x];i;i=e[i].nxt){ int j=e[i].v; if(!dfn[j]){ tarjan(j); low[x]=min(low[j],low[x]); } else if(vis[j]){ low[x]=min(low[x],dfn[j]); } } if(dfn[x]==low[x]){ // cout<<x<<" : "; mn[++sum]=INT_MAX; do{ vis[in[top]]=0; bel[in[top]]=sum; // cout<<in[top]<<" "; mx[sum]=max(mx[sum],v[in[top]]); mn[sum]=min(mn[sum],v[in[top]]); }while(in[top--]!=x); // cout<<endl; } } int main(){ #ifdef Devil_Gary freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif n=read(),m=read(); for(int i=1;i<=n;i++) v[i]=read(); for(int i=1;i<=m;i++){ a[i]=read(),b[i]=read(),c[i]=read(); if(c[i]==1) add(a[i],b[i]); else add(a[i],b[i]),add(b[i],a[i]); } tarjan(1); for(int i=1;i<=tot;i++) e[i].v=e[i].nxt=0;tot=1; for(int i=1;i<=n;i++) head[i]=vis[i]=0;tot=1; for(int i=1;i<=m;i++) if(c[i]==1) if(bel[a[i]]!=bel[b[i]]) add(bel[a[i]],bel[b[i]]); fc(bel[1]); for(int i=1;i<=tot;i++) e[i].v=e[i].nxt=0;tot=1; for(int i=1;i<=n;i++) head[i]=0;tot=1; for(int i=1;i<=m;i++) if(c[i]==1) if(bel[a[i]]!=bel[b[i]]) add(bel[b[i]],bel[a[i]]); dfs(bel ,mx[bel ],ans); printf("%d",ans); }
相关文章推荐
- 【 洛谷P1073 】【NOIP2009】最优贸易
- 洛谷 P1073 [NOIP2009 T3] 最优贸易
- 【NOIP2009】洛谷P1073 最优贸易(SPFA + 反向建图)
- 【NOIP2009】洛谷1073 最优贸易【解法一】
- 洛谷P1073&NOIP2009 最优贸易
- [NOIP2009] 提高组 洛谷P1073 最优贸易
- 洛谷 1073 [NOIP2009] 最优贸易 类spfa
- NOIP2009-T3 洛谷-1073 最优贸易
- 【NOIP2009】洛谷1073 最优贸易【解法二】
- 洛谷——P1073 最优贸易 ([NOIP2009] )
- 【NOIP2009】最优贸易
- noip2009最优贸易
- NOIP 2009 提高组 复赛 trade 最优贸易
- NOIP2009 提高组 最优贸易 解题报告
- NOIP2009 题解 潜伏者 Hankson的趣味题 最优贸易 靶形数独
- NOIP2009解题报告(C/C++)(潜伏者)(Hankson的趣味题)(最优贸易)(靶形数独)
- 【NOIP2009】最优贸易
- [NOIP2009 最优贸易]
- NOIP 2009 最优贸易
- [NOIP2009]最优贸易 T3