bzoj4289
最短路
很容易想到边和边之间连边,但是这样菊花图就完蛋了
我们想办法优化一下,能不能不要每条边都连。
考虑查分,把一个点的出边串起来,这样就行了,每条无向边拆成两条就能保证了
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N = 2e5 + ;
- namespace IO
- {
- const int Maxlen = N * ;
- char buf[Maxlen], *C = buf;
- int Len;
- inline void read_in()
- {
- Len = fread(C, , Maxlen, stdin);
- buf[Len] = '\0';
- }
- inline void fread(int &x)
- {
- x = ;
- int f = ;
- while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
- while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
- x *= f;
- }
- inline void fread(long long &x)
- {
- x = ;
- long long f = ;
- while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
- while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
- x *= f;
- }
- inline void read(int &x)
- {
- x = ;
- int f = ; char c = getchar();
- while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
- while(c >= '' && c <= '') { x = (x << ) + (x << ) + c - ''; c = getchar(); }
- x *= f;
- }
- inline void read(long long &x)
- {
- x = ;
- long long f = ; char c = getchar();
- while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
- while(c >= '' && c <= '') { x = (x << 1ll) + (x << 3ll) + c - ''; c = getchar(); }
- x *= f;
- }
- } using namespace IO;
- int rd()
- {
- int x = , f = ;
- char c = getchar();
- while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
- while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
- return x * f;
- }
- int n, cnt = , source, sink, m;
- int head[N], hd[N * ], st[N], vis[N * ];
- ll d[N * ];
- struct edge {
- int nxt, to, w;
- } e[N * ];
- bool cmp(int i, int j)
- {
- return e[i].w < e[j].w;
- }
- void link(int *head, int u, int v, int w)
- {
- e[++cnt].nxt = head[u];
- head[u] = cnt;
- e[cnt].to = v;
- e[cnt].w = w;
- }
- int main()
- {
- read_in();
- fread(n);
- fread(m);
- for(int i = ; i <= m; ++i)
- {
- int u, v, w;
- fread(u);
- fread(v);
- fread(w);
- link(head, u, v, w);
- link(head, v, u, w);
- }
- source = ;
- sink = * m + ;
- for(int i = ; i <= n; ++i)
- {
- int top = ;
- for(int j = head[i]; j; j = e[j].nxt) st[++top] = j;
- sort(st + , st + top + , cmp);
- for(int j = ; j <= top; ++j)
- {
- int now = st[j], nxt = st[j + ];
- if(i == ) link(hd, source, now, e[now].w);
- if(e[now].to == n) link(hd, now, sink, e[now].w);
- link(hd, now, now ^ , e[now].w);
- if(j < top)
- {
- link(hd, now, nxt, e[nxt].w - e[now].w);
- link(hd, nxt, now, );
- }
- }
- }
- priority_queue<pair<ll, int>, vector<pair<ll, int> >, greater<pair<ll, int> > > q;
- memset(d, 0x3f3f, sizeof(d));
- d[source] = ;
- q.push({, source});
- while(!q.empty())
- {
- pair<ll, int> o = q.top();
- q.pop();
- int u = o.second;
- if(vis[u]) continue;
- vis[u] = ;
- for(int i = hd[u]; i; i = e[i].nxt) if(d[e[i].to] > d[u] + e[i].w)
- {
- d[e[i].to] = d[u] + e[i].w;
- q.push({d[e[i].to], e[i].to});
- }
- }
- printf("%lld\n", d[sink]);
- return ;
- }
bzoj4289的更多相关文章
- BZOJ4289 PA2012Tax(最短路)
一个暴力的做法是把边看成点,之间的边权为两边的较大权值,最短路即可.但这样显然会被菊花图之类的卡掉. 考虑优化建图.将边拆成两个有向边,同样化边为点.原图中同一条边在新图中的两个点之间连边权为原边权的 ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图
4289: PA2012 Tax Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 168 Solved: 69[Submit][Status][Dis ...
- BZOJ4289 : PA2012 Tax
一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...
- BZOJ4289 Tax 最短路建模
给定一个带边权的无向图,求1到n的最小代价路径.经过一个点的代价是路径上这个点的入边和出边的较大权值. \(n \le 100000, m \le 200000\). 一般的建图是考虑每个点,其入边和 ...
- bzoj4289 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- [BZOJ4289][PA2012]TAX(最短路)
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...
- [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- 【PA2012】【BZOJ4289】Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值.求从起点1到点N的最小代价. 起点的代价是离开起点的边的边权.终点的代价是进入终点的边的 ...
- bzoj4289 PA2012 Tax——点边转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...
随机推荐
- xml实现AOP
1.使用<aop:config></aop:config> 2.首先我们需要配置<aop:aspect></aop:aspect>,就是配置切面 2.1 ...
- Failure [INSTALL_FAILED_ALREADY_EXISTS]
1.发生原因 做unity开发的同事说apk无法安装,要我帮忙看下,然后我通过命令adb install安装apk,出现此提示 2.解决过程 首先想到的仍然是安装包已存在的问题,结果使用清理类软件清理 ...
- 《Python核心编程》数字类型
1.数字类型简单介绍 Python中数字类型包含:整型.长整型.布尔型.双精度浮点型.十进制浮点型.复数.这些数字类型都是不可变类型.也就是说,改变了数字的值会生成新的对象. 在Python中删除数字 ...
- SQLMAP源码分析(一)
说起来,学习Python很大一部分原因是由于对WEB安全的兴趣以及对SQLMAP这款工具的好奇,曾经设想学完Python基础就读一读SQLMAP源码,然而懒病一犯,随之就大江东去.近来,又重新燃起了读 ...
- MongoDB 征途
到目前为止,对数据库这块仍然捉襟见肘,仅限于懂一些MySQL,就更谈不上什么优化了. 细想来,还是没有项目驱动造成的...既然跟关系型数据库缘分未到,干脆直接go to NoSQL - MongoDB ...
- php中屏蔽date的错误
php中添加 date_default_timezone_set('asia/shanghai'); 可以屏蔽 <?php echo date('Y-m-d',$row3['time']); ...
- hbase shell删除没实用
用Xshell登陆linux主机后,在hbase shell下不能使用backspace和delete删除误输的指令,这是Xshell的配置问题: 在File->Properties->T ...
- Spring整合Hibernate的方法
一.基本支持 Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. Spring 对这些 ORM 框架的支持是一致的, 因此 ...
- 九度OJ 1089:数字反转 (数字反转)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3059 解决:1678 题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个 ...
- JAVA with Cassandra
maven项目,在pom.xml里加入依赖.不是的话下载相应的jar包放到lib目录下.这里驱动包的版本要和你cassandra的大版本一致. <dependency> <group ...