【bzoj1179】 Apio2009—Atm
生活随笔
收集整理的這篇文章主要介紹了
【bzoj1179】 Apio2009—Atm
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
www.lydsy.com/JudgeOnline/problem.php?id=1179?(題目鏈接)
題意
給出一張有向圖,每個節(jié)點有點權(quán)。標記一些點,找出一條路徑,可以重復(fù)經(jīng)過一條邊,使得總點權(quán)和最大。重復(fù)經(jīng)過一個點不能重復(fù)算點權(quán)。
Solution
今日考試題,Dijkstra不幸Gi爛。
WARNING:Dijkstra處理最長路時會出現(xiàn)一些不好的情況,所以千萬不要用!!
既然可以重復(fù)經(jīng)過一些邊,那么一旦經(jīng)過了某個環(huán),我們一定可以把環(huán)上所有的點跑遍,所以做法就很顯然了。先Tarjan縮點,所以整個圖就變成有向無環(huán)圖,跑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; }
轉(zhuǎn)載于:https://www.cnblogs.com/MashiroSky/p/5914038.html
總結(jié)
以上是生活随笔為你收集整理的【bzoj1179】 Apio2009—Atm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kvm之三:本地安装虚拟机
- 下一篇: 【poj2187】 Beauty Con