UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)
UVA
题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径;
思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因为题意是看着博客做的,不小心看到了他的思路,就自己实现了一遍,二分温度,假设当前温度为x,求保证最大温度为x的情况下的最短路;打印路径就是递归打印。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define oo 1e9
#define repu(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
typedef long long LL;
const int maxn=;
const int INF=0x3f3f3f3f;
int rode[maxn];
int st,ed;
struct Edge
{
int u, v;
double t, d;
Edge(int u, int v, double t, double d):u(u), v(v), t(t), d(d) {}
};
struct qnode
{
int u;
double d;
qnode(int u, double d):u(u), d(d) {}
bool operator < (const qnode a)const
{
return d > a.d;
}
};
struct Dijkstra
{
int n;
vector<int> G[maxn];
vector<Edge> edge;
double d[maxn];
bool vis[maxn];
void init(int n)
{
this->n=n;
for(int i=; i<=n; i++)
{
G[i].clear();
vis[i]=;
d[i]=INF;
}
edge.clear();
}
void AddEdge(int u, int v, double t, double d)
{
G[u].push_back(edge.size());
edge.push_back(Edge(u, v, t, d));
}
bool dijkstra(double cur)
{
memset(rode, -, sizeof rode);
memset(vis, , sizeof vis);
repu(i,,n+)
d[i] = oo;
priority_queue<qnode> q;
d[st]=0.00;
q.push(qnode(st, ));
while(!q.empty())
{
qnode x=q.top();
q.pop();
if(vis[x.u])
continue ;
vis[x.u]=true;
if(x.u == ed)
return true;
for(int i=; i<G[x.u].size(); i++)
{
Edge& e=edge[G[x.u][i]];
if(e.t <= cur&& d[e.v]>d[x.u]+e.d)
{
///加条件,保证最大的温度是e.t
d[e.v]=d[x.u]+e.d;
rode[e.v]=x.u;///保存路径
q.push(qnode(e.v, d[e.v]));
}
}
}
return d[ed] < oo;
}
} dij;
void printroad(int x)
{
if(x==st)
{
printf("%d", x);
return ;
}
printroad(rode[x]);
printf(" %d", x);
}
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
dij.init(m);
scanf("%d%d",&st,&ed);
int u,v;
double c,w;
vector<double> se;
repu(i,,n)
{
scanf("%d%d%lf%lf",&u,&v,&c,&w);
se.push_back(c);
dij.AddEdge(u, v, c, w);
dij.AddEdge(v, u, c, w);
}
sort(se.begin(),se.end());///按照温度排序进行二分
int L = , R = unique(se.begin(),se.end())- se.begin()-;
int mid;
while(L<R)
{
mid=(L+R)/;
if(dij.dijkstra(se[mid]))
R=mid;///如果存在就找更小的温度
else L=mid+;
}
dij.dijkstra(se[R]);///找到的R就是最终的条件
printroad(ed);
printf("\n%.1lf %.1lf\n", dij.d[ed], se[R]);
}
return ;
}
HDU
题意:起点1,终点m,每条道路都有一个最大容量,以及通过的时间,求在时间T内能过的最大的容量;
思路:得用最大流吧,但是可能数据水,跟上一题一样的思路居然也能过。
注意:说代码的话,跟上一题完全一样,除了二分,但我被坑的一点就是二分,L跟R赋值的时候没改掉,就debug其他的地方,花费了不少的时间;
按照从小到大的顺序排好后,进行二分,注意mid = (l + r + 1)/ 2;符合的 l = mid;否则r = mid -1;(这是找越大的越好)---mid为啥+1母鸡啊
按照从小到大的顺序排好后,进行二分,注意mid = (l + r )/ 2;符合的 l = mid - 1;否则r = mid ;(这是找越小的越好)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define repu(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
typedef long long LL;
const int maxn=;
const int INF=0x3f3f3f3f;
int rode[maxn];
int st,ed,T;
struct Edge
{
int u, v;
int t, d;
Edge(int u, int v, int t, int d):u(u), v(v), t(t), d(d) {}
};
struct qnode
{
int u;
int d;
qnode(int u, int d):u(u), d(d) {}
bool operator < (const qnode a)const
{
return d > a.d;
}
};
struct Dijkstra
{
int n;
vector<int> G[maxn];
vector<Edge> edge;
int d[maxn];
bool vis[maxn];
void init(int n)
{
this->n=n;
for(int i=; i<=n; i++)
{
G[i].clear();
vis[i]=;
d[i]=INF;
}
edge.clear();
}
void AddEdge(int u, int v, int t, int d)
{
G[u].push_back(edge.size());
edge.push_back(Edge(u, v, t, d));
}
int dijkstra(int cur)
{
memset(vis, , sizeof vis);
repu(i,,n+)
d[i]=i==?:INF;
priority_queue<qnode> q;
d[st]=;
q.push(qnode(st, ));
while(!q.empty())
{
qnode x=q.top();
q.pop();
if(vis[x.u])
continue ;
vis[x.u]=true;
if(x.u == ed)
return d[ed] <= T;
for(int i=; i<G[x.u].size(); i++)
{
Edge& e=edge[G[x.u][i]];
if(e.t >= cur && d[e.v] > d[x.u]+e.d)
{
///加条件,保证最小的容量是cur
d[e.v]=d[x.u]+e.d;
q.push(qnode(e.v, d[e.v]));
}
}
}
return d[ed] <= T;
}
} dij;
int main()
{
int n,m,I;
scanf("%d",&I);
while(I--)
{
scanf("%d%d%d",&m,&n,&T);
dij.init(m);
st = ;
ed = m;
int u,v;
int c,w;
vector<int> se;
repu(i,,n)
{
scanf("%d%d%d%d",&u,&v,&c,&w);
se.push_back(c);
dij.AddEdge(u, v, c, w);
dij.AddEdge(v, u, c, w);
}
sort(se.begin(),se.end());///按照容量排序进行二分
int L = , R = unique(se.begin(),se.end())- se.begin()-;
int mid;
while(L < R)///居然在这里栽坑了
{
mid=(L + R + )/;
if(dij.dijkstra(se[mid]))
L=mid;///如果存在就找更大的容量
else R=mid-;
}
printf("%d\n", se[L]);
}
return ;
}
UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)的更多相关文章
- hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路
Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...
- hdu 1839 Delay Constrained Maximum Capacity Path(spfa+二分)
Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65 ...
- HDU 1839
http://acm.hdu.edu.cn/showproblem.php?pid=1839 题意:从1到n,要求时间小于等于T到达.每条边有一个容量,问最多能运多少货物. 分析:最多能运的货物取决于 ...
- UVa 714 Copying Books(二分)
题目链接: 传送门 Copying Books Time Limit: 3000MS Memory Limit: 32768 KB Description Before the inventi ...
- hdu 2413(最大匹配+二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...
- HDU 5884 Sort (二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...
- UVA 10668 - Expanding Rods(数学+二分)
UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图能够非常easy推出 ...
- hdu 1281棋盘游戏(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...
随机推荐
- 【转】ini载入保存类,操作INI配置文件方便的很
/****************************************************************** * * ^_^ 恶猫 独门商标 挖哈哈 * * QQ:\> ...
- VBA中使用JavaScript脚本语言解析JSON数据
JSON:JavaScript 对象表示法(JavaScript Object Notation) 和xml相似,都是文本形式(保存在文本文件中或字符串等形式),比如: jsstr = {" ...
- 解决打开CHM文件后,右侧空白
在网上下了一个chm的文件,打开后只有目录,右侧不显示内容. 不知道是文件有问题,还是系统有问题. <ignore_js_op> 右键点击文件–属性 看到 最下面有一个提示 说是这个文件是 ...
- php : 类常量
使用总结: 1.不能使用 define 来定义 2.通过 "类名::常量名" 来获取 /** * PHP类常量 * * 类常量属于类自身,不属于对象实例,不能通过对象实例访问 * ...
- mysql命令导出导入数据和结构
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...
- Less入门到上手——前端开发利器<二>深入了解
接着昨天的继续... ... 4.嵌套: HTML部分 <table> <tr> <th colspan="3">测试列表标题</th&g ...
- exec函数族实例解析
exec函数族实例解析 fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的 ...
- jqGrid表格控件
一. jqGrid的加载. 1.引用相关头文件 引入CSS: <link type="text/css" rel="stylesheet" href=&q ...
- 你真的会写单例模式吗-------Java实现
转载: 你真的会写单例模式吗--Java实现 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好.用对单例模式,还真得费一番脑筋.本文对Java中常见的单例模式写法做了一个总结,如有错漏 ...
- 习题-第1章了解ASP.NET MVC
一.选择题 1.ASP.NET MVC自2007年首次公布预览以来,作为( )的替代品,普及度已明显提高,现在很多大型Web应用程序都是使用这一技术构建的. A.ASP B.ASP.NET ...