日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj1179】 Apio2009—Atm

發布時間:2025/4/9 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj1179】 Apio2009—Atm 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

www.lydsy.com/JudgeOnline/problem.php?id=1179?(題目鏈接)

題意

  給出一張有向圖,每個節點有點權。標記一些點,找出一條路徑,可以重復經過一條邊,使得總點權和最大。重復經過一個點不能重復算點權。

Solution

  今日考試題,Dijkstra不幸Gi爛。

  WARNING:Dijkstra處理最長路時會出現一些不好的情況,所以千萬不要用!!

  既然可以重復經過一些邊,那么一旦經過了某個環,我們一定可以把環上所有的點跑遍,所以做法就很顯然了。先Tarjan縮點,所以整個圖就變成有向無環圖,跑DP或者SPFA最長路即可。

代碼

// bzoj1179 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define LL long long #define inf 2147483640 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std;const int maxn=500010; struct data {int num,x;friend bool operator < (const data &x,const data &y) {return x.x<y.x;} }; struct edge {int to,next;}e[maxn<<1]; struct E {int u,v;}ee[maxn]; int dis[maxn],head[maxn],dfn[maxn],low[maxn],st[maxn],vis[maxn],pos[maxn],a[maxn],w[maxn],ll[maxn]; int n,m,top,sum,cnt,S,ind,p;void link(int u,int v) {e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt; } void Tarjan(int x) {dfn[x]=low[x]=++ind;vis[x]=1;st[++top]=x;for (int i=head[x];i;i=e[i].next) {if (!vis[e[i].to]) {Tarjan(e[i].to);low[x]=min(low[x],low[e[i].to]);}else if (!pos[e[i].to])low[x]=min(low[x],dfn[e[i].to]);}if (dfn[x]==low[x]) {sum++;int j;do {j=st[top--];pos[j]=sum;w[sum]+=a[j];}while (st[top+1]!=x);} } void Dijkstra() {priority_queue<data> q;for (int i=1;i<=sum;i++) dis[i]=-inf;data y,x=(data){S,w[S]};q.push(x);dis[S]=w[S];while (q.size()) {x=q.top();q.pop();if (vis[x.num]) continue;vis[x.num]=1;for (int i=head[x.num];i;i=e[i].next)if (dis[e[i].to]<dis[x.num]+w[e[i].to]) {dis[e[i].to]=y.x=dis[x.num]+w[e[i].to];y.num=e[i].to;q.push(y);}} } void SPFA() {queue<int> q;for (int i=1;i<=sum;i++) dis[i]=-inf;q.push(S);dis[S]=w[S];while (q.size()) {int x=q.front();q.pop();vis[x]=0;for (int i=head[x];i;i=e[i].next)if (dis[e[i].to]<dis[x]+w[e[i].to]) {dis[e[i].to]=dis[x]+w[e[i].to];if (!vis[e[i].to]) q.push(e[i].to);}} } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) {scanf("%d%d",&ee[i].u,&ee[i].v);link(ee[i].u,ee[i].v);}for (int i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d%d",&S,&p);Tarjan(S);S=pos[S];for (int x,i=1;i<=p;i++) {scanf("%d",&x);ll[pos[x]]=1;}for (int i=1;i<=n;i++) vis[i]=head[i]=0;for (int i=1;i<=m;i++)if (pos[ee[i].u]!=pos[ee[i].v]) link(pos[ee[i].u],pos[ee[i].v]);//Dijkstra(); 萬萬不可SPFA();int ans=0;for (int i=1;i<=sum;i++) if (ll[i]) ans=max(ans,dis[i]);printf("%d",ans);return 0; }

  

轉載于:https://www.cnblogs.com/MashiroSky/p/5914038.html

總結

以上是生活随笔為你收集整理的【bzoj1179】 Apio2009—Atm的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。