Analysis

建图+强连通分量+SPFA求最长路

但要保证最后到达的点中包含酒馆

虽然思路并不难想,但要求的代码能力很高。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #define maxn 500010
  7 using namespace std;
  8 inline int read()
  9 {
 10     int x=0;
 11     bool f=1;
 12     char c=getchar();
 13     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
 14     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
 15     if(f) return x;
 16     return 0-x;
 17 }
 18 inline void write(int x)
 19 {
 20     if(x<0){putchar('-');x=-x;}
 21     if(x>9)write(x/10);
 22     putchar(x%10+'0');
 23 }
 24 struct node
 25 {
 26     int from,to,val,nex;
 27 }edge[2*maxn];
 28 int n,m,s,p,cnt,ans,top,inl,num;
 29 int x[maxn],y[maxn],head[maxn],dfn[maxn],low[maxn],st[maxn],inn[maxn],sum[maxn],si[maxn],money[maxn],dis[maxn];
 30 bool book[maxn],book1[maxn],bar[maxn];
 31 inline void clear()
 32 {
 33     cnt=0;
 34     memset(edge,0,sizeof(edge));
 35     memset(head,0,sizeof(head));
 36 }
 37 inline void add(int x,int y)
 38 {
 39     cnt++;
 40     edge[cnt].to=y;
 41     edge[cnt].nex=head[x];
 42     head[x]=cnt;
 43 }
 44 inline void build(int x,int y,int z)
 45 {
 46     cnt++;
 47     edge[cnt].from=x;
 48     edge[cnt].to=y;
 49     edge[cnt].val=z;
 50     edge[cnt].nex=head[x];
 51     head[x]=cnt;
 52 }
 53 inline void Tarjan(int u)
 54 {
 55     dfn[u]=low[u]=++num;
 56     st[++top]=u;
 57     for(int i=head[u];i;i=edge[i].nex)
 58     {
 59         int v=edge[i].to;
 60         if(!dfn[v])
 61         {
 62             Tarjan(v);
 63             low[u]=min(low[u],low[v]);
 64         }
 65         else if(!inn[v])
 66             low[u]=min(low[u],dfn[v]);
 67     }
 68     if(low[u]==dfn[u])
 69     {
 70         inn[u]=++inl;
 71         while(st[top]!=u)
 72         {
 73             if(bar[st[top]])book1[inl]=1;
 74             sum[inl]+=money[st[top]];
 75             inn[st[top]]=inl;
 76              --top;
 77         }
 78         if(bar[st[top]])book1[inl]=1;
 79         sum[inl]+=money[st[top]];
 80         --top;
 81     }
 82 }
 83 inline void spfa()
 84 {
 85     memset(book,0,sizeof(book));
 86     for(int i=1;i<=n;i++) dis[i]=0;
 87     queue<int> q;
 88     q.push(inn[s]);
 89     book[inn[s]]=1;
 90     dis[inn[s]]=sum[inn[s]];
 91     while(!q.empty())
 92     {
 93         for(int i=head[q.front()];i;i=edge[i].nex)
 94         {
 95             if(dis[edge[i].to]<dis[edge[i].from]+edge[i].val)
 96             {
 97                 dis[edge[i].to]=dis[edge[i].from]+edge[i].val;
 98                 if(book[edge[i].to]==0)
 99                 {
100                     q.push(edge[i].to);
101                     book[edge[i].to]=1;
102                 }
103             }
104         }
105         book[q.front()]=0;
106         q.pop();
107     }
108 }
109 int main()
110 {
111     n=read();m=read();
112     for(int i=1;i<=m;i++)
113     {
114         x[i]=read();y[i]=read();
115         add(x[i],y[i]);
116     }
117     for(int i=1;i<=n;i++)money[i]=read();
118     s=read();p=read();
119
120     for(int i=1;i<=p;i++)
121     {
122         int x;
123         x=read();
124         bar[x]=1;
125     }
126     for(int i=1;i<=n;i++)
127         if(!dfn[i])
128             Tarjan(i);
129
130     clear();
131     for(int i=1;i<=m;i++)
132         if(inn[x[i]]!=inn[y[i]])
133             build(inn[x[i]],inn[y[i]],sum[inn[y[i]]]);
134     spfa();
135     for(int i=1;i<=inl;i++)
136         if(book1[i]==1)
137             ans=max(ans,dis[i]);
138     write(ans);
139     return 0;
140 }
请各位大佬斧正(反正我不认识斧正是什么意思)

转载于:https://www.cnblogs.com/handsome-zyc/p/11250401.html

洛谷 P3627 [APIO2009]抢掠计划 题解相关推荐

  1. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  2. 【luogu P3627 [APIO2009]抢掠计划】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...

  3. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  4. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  5. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

  6. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  7. 洛谷P4170 [CQOI2007]涂色 题解

    洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...

  8. 洛谷P1868 饥饿的奶牛 题解

    洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...

  9. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

最新文章

  1. 开始使用vue.js
  2. 什么是Session?
  3. angular 构建可以动态挂载的配置服务
  4. 计算机文化基础分析总结,《计算机文化基础实训》教学方案设计与课题分析总结.doc...
  5. (8)Verilog include 头文件使用路径(FPGA不积跬步101)
  6. 开源项目:SandDance-数据可视化
  7. netstat mysql_mysql-netstat
  8. Nginx+Tomcat搭建高性能负载均衡集群的实现方法
  9. 诗词文中的地名(名人生卒地、生卒年、名人籍贯)
  10. 【转】java中的Map集合
  11. c++ 实现四阶龙格库塔方法
  12. spring boot 邮箱验证总结
  13. flashfxp 命令行
  14. pacman系列命令
  15. 软件工程实践寒假作业
  16. Hbase Locality
  17. 7个小学语文学习锦囊,让孩子取得好的成绩(转给家长)
  18. for in 循环(遍历循环)
  19. 牛客小白月赛28 D.位运算之谜
  20. Fiddler抓包工具是最强大最好用的 Web 调试工具之一

热门文章

  1. java okhttp https_OkHttp是否支持接受自签名SSL证书?
  2. 央视网报道“手机就能打到拖拉机”,网友直呼“想种地了”
  3. 从微服务到 Serverless | 开源只是开始,终态远没有到来
  4. sqlserver日期dateadd及STUFF等应用
  5. SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
  6. 同步一张表、复制过滤设置
  7. 查询DBA_HIST_ACTIVE_SESS_HISTORY缓慢
  8. ORA-01720: grant option does not exist for 'xxx.xxxx'
  9. 017_python常用小技巧
  10. python学习之自习语法(20180626_update)