道路修建 (网络流)

  1 const INF=2000000000;
  2 const maxn=4008;
  3 var r:array[0..maxn] of longint;
  4     eg:array[0..1000008] of record u,v,w,nt:longint; end;
  5     el:longint;
  6     lt:array[0..maxn] of longint;
  7     h,l:array[0..maxn] of longint;
  8     b:array[0..10008] of longint;
  9     i,j,k,n,s,t,m,x,y:longint;
 10 function op(i,j:longint):longint; inline;
 11 begin
 12     exit((i-1)*n+j);
 13 end;
 14 function calc(x,y:longint):longint; inline;
 15 begin
 16     exit(trunc(10*ln(233*(x-y)*(x-y)+1)));
 17 end;
 18 procedure adt(u,v,w:longint);
 19 begin
 20     inc(el);
 21     eg[el].u:=u;
 22     eg[el].v:=v;
 23     eg[el].w:=w;
 24     eg[el].nt:=lt[u];
 25     lt[u]:=el;
 26 end;
 27 procedure add(u,v,w:longint);
 28 begin
 29      //   writeln(u,‘ ‘,v,‘ ‘,w);
 30     adt(u,v,w); adt(v,u,0);
 31 end;
 32 procedure bfs;
 33 var i,l,r,x:longint;
 34 begin
 35     fillchar(h,sizeof(h),$7f);
 36     h[t]:=0;
 37     l:=1; r:=1; b[1]:=t;
 38     while l<=r do
 39     begin
 40         x:=b[l];
 41         i:=lt[x];
 42         while i<>0 do
 43         begin
 44             if (h[eg[i].v]>=n) and (eg[i xor 1].w>0) then
 45             begin
 46                 inc(r);
 47                 b[r]:=eg[i].v;
 48                 h[eg[i].v]:=h[x]+1;
 49             end;
 50             i:=eg[i].nt;
 51         end;
 52         inc(l);
 53     end;
 54 end;
 55 function min(a,b:longint):longint; inline;
 56 begin
 57     if a<b then exit(a) else exit(b);
 58 end;
 59 function dfs(u,inl:longint):longint;
 60 var i,v,outl:longint;
 61 begin
 62     if u=t then exit(inl);
 63     dfs:=0;
 64     i:=lt[u];
 65     while i<>0 do
 66     begin
 67         v:=eg[i].v;
 68         if (v>l[u]) and (eg[i].w>0) and (l[v]<n) and (h[u]=h[v]+1) then
 69         begin
 70             outl:=dfs(v,min(eg[i].w,inl));
 71             dec(inl,outl);
 72             inc(dfs,outl);
 73             dec(eg[i].w,outl);
 74             inc(eg[i xor 1].w,outl);
 75             if inl=0 then break;
 76             inc(l[u]);
 77         end;
 78         i:=eg[i].nt;
 79     end;
 80 end;
 81 function dinic:longint;
 82 var sum:longint;
 83 begin
 84     bfs;
 85     sum:=0;
 86     while h[s]<n do
 87     begin
 88         fillchar(l,sizeof(l),0);
 89         sum:=sum+dfs(s,INF);
 90         bfs;
 91         //writeln(sum);
 92     end;
 93     exit(sum);
 94 end;
 95 begin
 96     //assign(input,‘1.in‘);reset(input);
 97     el:=1;
 98     readln(n,m);
 99     for i:=1 to n do read(r[i]);
100     s:=0; t:=n*n+1;
101     for i:=1 to n do
102     begin
103         if i=1 then add(s,op(i,1),calc(0,r[i]))
104                else add(s,op(i,1),INF);
105         for j:=2 to n do
106             if i<>1 then
107                 add(op(i,j-1),op(i,j),calc(j-1,r[i]))
108             else
109                 add(op(i,j-1),op(i,j),INF);
110         if i=1 then add(op(i,n),t,INF) else add(op(i,n),t,calc(n,r[i]))
111     end;
112
113     for i:=1 to m do
114     begin
115         readln(x,y);
116         for k:=2 to n do
117         begin
118             add(op(x,k),op(y,k-1),INF);
119             add(op(y,k),op(x,k-1),INF);
120         end;
121     end;
122     n:=n*n+1;
123     writeln(dinic);
124 end.
时间: 2024-11-06 16:25:10

道路修建 (网络流)的相关文章

【BZOJ-2435】道路修建 (树形DP?)DFS

2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3115  Solved: 1002[Submit][Status][Discuss] Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家

A1. 道路修建 Small(BNUOJ)

A1. 道路修建 Small Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      Java class name: Main Submit Status 无向图初始有个点,从到依次标号,但是没有边, 接下来有次操作,从到依次标号,你需要对每种操作输出相应的结果,操作分为两种: 输入格式 操作说明 输出结果 0_u_v 加入一条连接标号为和标号为的点的边. 输出加边后图中连通块的个数. 1_u_

bzoj2435[Noi2011]道路修建

bzoj2435[Noi2011]道路修建 题意: 给个n点树,每条边的费用为这条边两端的节点数的差值*这条边的长度,求这个数的总费用. 题解: 水题,dfs求出节点的子树大小sz,对于每一条边,费用为深度大的sz值与n-sz相减的绝对值乘边的长度. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i+

2435: [Noi2011]道路修建(求助!!!)

2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2188  Solved: 639[Submit][Status] Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值.例

【NOI2011】道路修建 BFS

[NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值.例如,在下图中,虚线所示道路两端分别有 2 个.4个国家,如果该道路长度为 1,则费用为1×|2 – 4|=2.图中圆圈里的数字表示国家的编号. 由于国家的数量十分庞大,道路的建

【BZOJ】【2435】【NOI2011】道路修建

DFS/DP 本来以为是一道傻逼题,然而跪了好久……一直RE…… 直接dfs就好了……x->y val=c  :  ans+=abs(n-size[y]-size[y])*c; 然而为啥会一直RE呢? 后来改成dfs返回当前节点的size就过了……过了…… 100W的节点难道linux下也会爆栈嘛= =?sad 1 /************************************************************** 2 Problem: 2435 3 User: Tun

2435: [Noi2011]道路修建 - BZOJ

Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值.例如,在下图中,虚线所示道路两端分别有 2 个.4个国家,如果该道路长度为 1,则费用为1×|2 – 4|=2.图中圆圈里的数字表示国家的编号. 由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案

bzoj 2435: [Noi2011]道路修建 树上 dp

2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2435 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道路. 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘

NOIp2011道路修建

题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道路的修建都要付出一定的费用,这个费用等于道路长度乘以道路两端 的国家个数之差的绝对值.例如,在下图中,虚线所示道路两端分别有 2 个.4 个国家,如果该道路长度为 1,则费用为 1×|2 – 4|=2.图中圆圈里的数字表示国 家的编号.  由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案

【BZOJ】2435: [Noi2011]道路修建(树形dp)

http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue&