P1073 [NOIP2009 提高组] 最优贸易
感觉分层图的做法太nb了吧,每次向下连边更新权值,我确实没什么补充的了,还是看大佬的吧。
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=1e7+10; int n,m; int val[N]; int cnt; int head[N]; struct ss{ int to,w,next; }a[N]; void add(int u,int v,int w){ a[cnt].to=v; a[cnt].w=w; a[cnt].next=head[u]; head[u]=cnt++; } ll dis[N]; bool vis[N]; queue<int> q; void spfa(){ for(int i=1;i<=n*3;i++){ dis[i]=INT_MIN; } dis[1]=0; q.push(1); vis[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];~i;i=a[i].next){ int v=a[i].to; if(dis[v]<dis[u]+a[i].w){ dis[v]=dis[u]+a[i].w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ ios::sync_with_stdio(false); memset(head,-1,sizeof head); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>val[i]; } for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; add(u,v,0); add(u+n,v+n,0); add(u+n+n,v+n+n,0); if(w==2){ add(v,u,0); add(v+n,u+n,0); add(v+n+n,u+n+n,0); } } for(int i=1;i<=n;i++){ add(i,i+n,-val[i]); add(i+n,i+n+n,val[i]); } spfa(); cout<<dis[n*3]; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」