[Apio2009]Atm

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<string>
  5 #include<vector>
  6 #include<queue>
  7 #include<stack>
  8 #include<set>
  9 #include<algorithm>
 10 using namespace std;
 11 #define N 500001
 12 stack<int>Sta;
 13 queue<int>Que;
 14 struct edge
 15 {
 16     int u,v,next;
 17 }edge1[N],edge2[N];
 18 bool isBar[N],inStack[N];
 19 int low[N],dfn[N],belong[N],money[N],newMoney[N],cnt,Time,start;
 20 int maxMoney[N],head[N],head2[N];
 21
 22 void add(int u, int v, int id)
 23 {
 24     edge1[id].u = u;
 25     edge1[id].v = v;
 26     edge1[id].next = head[u];
 27     head[u] = id;
 28 }
 29
 30 void add2(int u, int v, int id)
 31 {
 32     edge2[id].u = u;
 33     edge2[id].v = v;
 34     edge2[id].next = head2[u];
 35     head2[u] = id;
 36 }
 37 void Tarjan(int s)
 38 {
 39     dfn[s] = low[s] = ++Time;
 40     Sta.push(s);
 41     inStack[s] = true;
 42     for(int u = head[s]; ~u; u = edge1[u].next)
 43     {
 44         int v = edge1[u].v;
 45         if(dfn[v] == 0){
 46             Tarjan(v);
 47             low[s] = min(low[s], low[v]);
 48         }
 49         else if(inStack[v] == true){
 50             low[s] = min(low[s], dfn[v]);
 51         }
 52     }
 53     if(dfn[s] == low[s])
 54         {
 55             cnt ++;
 56             while(!Sta.empty()){
 57               int temp = Sta.top(); Sta.pop();
 58               belong[temp] = cnt;
 59               newMoney[cnt] += money[temp];
 60               inStack[temp] = false;
 61               if(temp == s) break;
 62             }
 63         }
 64 }
 65
 66 int spfa()
 67 {
 68     int ans = 0;
 69     Que.push(start);
 70     memset(maxMoney,0,sizeof(maxMoney));
 71     maxMoney[start] = newMoney[start];
 72     while(!Que.empty())
 73     {
 74         int now = Que.front(); Que.pop();
 75         for(int u = head2[now]; ~u; u = edge2[u].next)
 76         {
 77             int v = edge2[u].v;
 78             if(maxMoney[now] + newMoney[v] > maxMoney[v])
 79             {
 80                 maxMoney[v] = maxMoney[now] + newMoney[v];
 81                 Que.push(v);
 82             }
 83             if(isBar[v]) ans = max(ans, maxMoney[v]);
 84         }
 85     }
 86     return ans;
 87 }
 88
 89 int main()
 90 {
 91     int n,m,a,b,s,p;
 92     scanf("%d%d",&n,&m);
 93     memset(head,-1,sizeof(head));
 94     for (int i = 0; i < m; i++) {
 95       /* code */
 96       scanf("%d%d",&a, &b);
 97       add(a,b,i+1);
 98     }
 99     for (int i = 1; i <= n; i++) {
100       /* code */
101       scanf("%d",&money[i]);
102     }
103     scanf("%d%d",&s,&p);
104     memset(inStack,false,sizeof(inStack));
105     memset(newMoney,0,sizeof(newMoney));
106     memset(isBar,false,sizeof(isBar));
107     memset(dfn,0,sizeof(dfn));
108     cnt = Time = 0;
109     for(int i = 1; i <= n; i++) if(dfn[i] == 0) Tarjan(i);
110     if(cnt == 1) {printf("%d",newMoney[cnt]);return 0;}
111     for(int i=0;i<p;i++)
112     {
113       scanf("%d", &a);
114       isBar[belong[a]] = true;
115     }
116     start = belong[s];
117     memset(head2,-1,sizeof(head2));
118     int kkk = 0;
119     for(int i =1; i <= n; i ++)
120     {
121         for(int u = head[i]; ~u; u = edge1[u].next){
122             int v = edge1[u].v;
123             if(belong[i] != belong[v]){
124                 add2(belong[i],belong[v],++kkk);
125             }
126         }
127     }
128
129     int ans = spfa();
130     printf("%d", ans);
131 }

时间: 2024-08-18 22:45:45

[Apio2009]Atm的相关文章

1179: [Apio2009]Atm

1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1629  Solved: 615[Submit][Status] Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来一行包含两个整数S

bzoj1179: [Apio2009]Atm

tarjan缩点就是DAG上求最长路把...然而我并不会求...只会写spfa了... #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<stack> #include<queue> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #defin

BZOJ1179 : [Apio2009]Atm 缩点+spfa

1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2069  Solved: 826[Submit][Status][Discuss] Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来

BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. --------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; ++i) #define clr(x, c) memset(x, c, sizeof(x)) #define foreach(i,

tarjan+spfa最短路 BZOJ1179 [Apio2009] Atm

1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 3641  Solved: 1552[Submit][Status][Discuss] Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下

缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设在路口,虽然并不是每个路口都设有酒吧.Banditji 计划实施 Siruseri 有史以来最惊天动地的 ATM 抢劫.他将从市中心 出发,沿着单向道路行驶,抢劫所有他 途径的 ATM 机,最终他将在一个酒吧庆 祝他的胜利.使用高超

bzoj 1179: [Apio2009]Atm

Description Input 第 一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路 的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来一行包含两个整数S.P,S表示市中心的编号,也就 是出发的路口.P表示酒吧数目.接下来的一行中有P个整数,表示P个有酒吧的路口的编号 Output 输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的

bzoj 1179[Apio2009]Atm (tarjan+spfa)

题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来一行包含两个整数S.P,S表示市中心的编号,也就是出发的路口.P表示酒吧数目.接下来的一行中有P个整数,表示P个有酒吧的路口的编号 输出 输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数. 样例输入 6 7 1

【强连通分量&#183;Tarjan】bzoj1179: [Apio2009]Atm

新博的第一发! 因为这几天切了几道强连通分量,所以从这里begin [题目描述] Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定,在每个路口都设立了一个Siruseri 银行的ATM 取款机.令人奇怪的是,Siruseri的酒吧也都设在路口,虽然并不是每个路口都设有酒吧.Banditji 计划实施Siruseri 有史以来最惊天动地的ATM 抢劫.他将从市中心出发,沿着单向道路行驶,抢劫所有他途径的ATM 机,最终他将在一个酒吧庆祝他的胜利.使用高超的黑客技术,他获

【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)

http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <set> #