Description

西山风景区是苏州著名的国家级风景区,一到暑假,游客们都蜂拥而至。作为太湖风景区的精华,西山景区吸引人的地方主要在它的群岛风光、花果丛林和名胜古迹。

ginrat对这个地方向往已久,在暑假时忙里偷空出来玩了一次。一到景区,具有特殊观察力的他就开始观察,他发现,景区实际上是由太湖的一部分水域和露出水面的许多小岛构成的,小岛之间由许多桥(或者是堤坝,whatever)连接。ginrat是一个玩起来很有责任心的人,他非常想要逛完每个岛、每个桥,可bj提醒他,网页小组还等着他回去写文档,时间紧迫。根据导游的信息,这里共有\(n\)座岛,\(m\)座桥,ginrat开跑车经过每个桥或岛的时间很少很少,但他却要在每个桥或岛上面好好欣赏风景,这需要一定的时间。他不会重复在一个岛或桥上面欣赏风景。由于时间紧迫,他也降低了自己的目的。如果一座桥连接的两座岛他都在上面欣赏过了,这座桥上的风景他就认为他已经看过了,如果一座岛周围连接的所有的桥上的风景他都看过了,那么岛上的风景他也不想看了。

现在ginrat需要最少的时间来逛完景区,你能帮他吗?

Input Format

第一行两个整数\(n\)和\(m\),分别表示岛屿的数量和桥的数量。

第二行有\(n\)个整数,分别表示n个岛屿ginrat观光所需要的时间。

第\(3~m+2\)行,每行三个整数,表示这座桥连接的两个岛的编号以及ginrat观光这座桥上风景所需要的时间。

Output Format

一个整数,ginrat观光所需最少时间。

Sample Input

2 1

2 2

1 2 1

Sample Output

1

Hint

\(n \le 500,m \le 1500\)

ginrat每次观光时间不超过\(100000\)

将边也看成一个点这个图便是二分图,然后就是一个最小割的经典题了,题解戳这里

由于没有收益,我们便可以把收益看成\(0\),然后连边即可。

首先将所有的边点染成黑色,其他的染成白色。

由源点向所有黑点连边,流量即为黑点的点权。再由所有白点向汇点连边,流量也为点权。最后若黑白点相连,由黑点向白点连流量为\(inf\)的边。跑最大流即可。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<queue>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. using namespace std;
  7. #define inf (1<<30)
  8. #define maxn (200010)
  9. int N,M,cnt = 1,source,sink,side[maxn],next[maxn]; bool in[maxn];
  10. int toit[maxn],cap[maxn],cur[maxn],nd[maxn],d[maxn],pre[maxn];
  11. inline int read()
  12. {
  13. char ch; int f = 1,ret = 0;
  14. do ch = getchar(); while (!(ch >= '0'&&ch <= '9')&&ch != '-');
  15. if (ch == '-') f = -1,ch = getchar();
  16. do ret = ret*10+ch-'0',ch = getchar(); while (ch >= '0'&&ch <= '9');
  17. return ret*f;
  18. }
  19. inline void add(int a,int b,int c) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; cap[cnt] = c; }
  20. inline void ins(int a,int b,int c) { add(a,b,c); add(b,a,0); }
  21. inline void bfs()
  22. {
  23. queue <int> team;
  24. memcpy(cur,side,4*(sink+1));
  25. team.push(sink); d[sink] = 1; in[sink] = true; d[sink] = 1;
  26. while (!team.empty())
  27. {
  28. int now = team.front(); team.pop(); nd[d[now]]++;
  29. for (int i = side[now];i;i = next[i])
  30. if (cap[i^1]&&!in[toit[i]])
  31. in[toit[i]] = true,d[toit[i]] = d[now]+1,team.push(toit[i]);
  32. }
  33. }
  34. inline int isap()
  35. {
  36. bfs();
  37. int res = 0,now = source,ca = inf;
  38. while (d[source] <= sink)
  39. {
  40. if (now == sink)
  41. {
  42. while (now != source)
  43. cap[pre[now]] -= ca,cap[pre[now]^1] += ca,now = toit[pre[now]^1];
  44. res += ca; ca = inf;
  45. }
  46. bool flag = false;
  47. for (int i = cur[now];i;i = next[i])
  48. if (cap[i] && d[toit[i]] == d[now]-1)
  49. {
  50. cur[now] = pre[toit[i]] = i; ca = min(ca,cap[i]);
  51. now = toit[i]; flag = true; break;
  52. }
  53. if (flag) continue;
  54. int arg = sink;
  55. if (!--nd[d[now]]) break;
  56. for (int i = side[now];i;i = next[i])
  57. if (cap[i]&&d[toit[i]] < arg) arg = d[toit[i]];
  58. ++nd[d[now] = arg+1]; cur[now] = side[now];
  59. if (now != source) now = toit[pre[now]^1];
  60. }
  61. return res;
  62. }
  63. int main()
  64. {
  65. freopen("1313.in","r",stdin);
  66. freopen("1313.out","w",stdout);
  67. N = read(); M = read();
  68. source = N+M+1; sink = N+M+2;
  69. for (int i = 1;i <= N;++i) ins(source,i,read());
  70. for (int i = 1;i <= M;++i)
  71. {
  72. int a = read(),b = read();
  73. ins(N+i,sink,read());
  74. ins(a,N+i,inf); ins(b,N+i,inf);
  75. }
  76. printf("%d",isap());
  77. fclose(stdin); fclose(stdout);
  78. return 0;
  79. }

sjtu1313 太湖旅行的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  3. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  4. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  5. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  6. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  7. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  8. 11.14 T2 小x的旅行(小x的旅行)

    1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...

  9. hdoj 2066 一个人的旅行

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

随机推荐

  1. my_vimrc

    " ----------------- Author: Ruchee" ----------------- Email: my@ruchee.com" --------- ...

  2. SqlBulkCopy 数据批量操作使用的类

    private void SqlBulkCopyByDataTable(string connectionString,string TableName,DataTable dt) { using ( ...

  3. JDK Tools - xjc: 将 XML Schema 编译成 Java 类

    xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命 ...

  4. 如何让Div层悬浮在Flash Object对象之上(转载)

    今天有个用户,门户右上角的倒三角登陆小按钮在他的电脑上无法显示,他用的笔记本屏幕较小,宽度正好显示出页面内容,经查看,门户页眉使用的为flash对象. 大家都知道,如果想让某个图片或者Div层悬浮在别 ...

  5. spring中加入log4j

    spring中加入log4j <context-param> <param-name>log4jConfigLocation</param-name> <pa ...

  6. Appium Python Driver Api

  7. 12天学好C语言——记录我的C语言学习之路(Day 1)

    12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program  1.1): /*//program 1.1 ...

  8. SQL SERVER 级联删除

    有三个表: Company Address Contact 在Address和Contact中建立外键,外键id为company的id, 那么就不能任意删除Company.但假如在外键约束中把级联删除 ...

  9. 层叠上下文 Stacking Context

    层叠上下文 Stacking Context 在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴.对于每个html元素,都可以通过设置z-index属性来设 ...

  10. C++ 中的“ !” 运算

    在介绍“ !”运算之前,我们要知道一个变量n,如果n>0,那么我们可以在逻辑上叫它“真”,如果n<=0 ,那么我们可以在逻辑上叫它“假”. n为真时,!n就为假(false),转换为整型值 ...