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 + 二分 (待研究)的更多相关文章

  1. hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路

    Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...

  2. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)

    Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...

  3. hdu 1839 Delay Constrained Maximum Capacity Path(spfa+二分)

    Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65 ...

  4. HDU 1839

    http://acm.hdu.edu.cn/showproblem.php?pid=1839 题意:从1到n,要求时间小于等于T到达.每条边有一个容量,问最多能运多少货物. 分析:最多能运的货物取决于 ...

  5. UVa 714 Copying Books(二分)

    题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the inventi ...

  6. hdu 2413(最大匹配+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...

  7. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...

  8. UVA 10668 - Expanding Rods(数学+二分)

    UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图能够非常easy推出 ...

  9. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281   Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...

随机推荐

  1. zigbee学习之路(二)点亮LED

    一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...

  2. Stockbroker Grapevine(floyd+暴力枚举)

    Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31264 Accepted: 171 ...

  3. RCP:如何移除Search对话框中不需要的项

    前言 很久没写文章了,准备写一系列关于Eclipse RCP /Plugin的文章. 这些文章都是trouble shooting性质的,不准备写的很细,当你碰到这样的问题,google到时,能帮你把 ...

  4. Web的Ajax应用开发模式(二)——Ajax开发模式分析

    寄语: 前天在查看一些公司的招聘要求时,看到有公司要求测试人员了解Ajax,故写此博文旨在帮助测试人员提高自身技术知识水平,愿与广大测试同胞共同进步.(欢迎纠错!!!) Web应用的传统开发模式总结: ...

  5. angular之控制器(0)

    一.控制器的含义 在angularJS中,controlle是一个javascript函数/类,用于操作作用域中,各个对象的初始状态以及相应的行为 二.控制器的作用 1. 控制 AngularJS 应 ...

  6. 13.KVM安装之网桥

    安装必须的几个库和软件(最好下载一个163的yum源,速度快点) $ yum -y install kvm python-virtinst libvirt tunctl bridge-utils vi ...

  7. io流操作大全

    JAVA 中的IO流 一.流的概念        流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部 ...

  8. [css]【转载张鑫旭】我是如何对网站CSS进行架构的

    一.写在前面的 都是自己积累形成的一些东西,可能带有明显的个人印记.不是专业内容,不是权威指南,只是展示一点自己的观点,借此希望能与各位优秀的同行交流看法,见解.以得到进步与提高. 二.我所知的一些过 ...

  9. HttpHelper类登录淘宝联盟并下载淘宝客订单xls

    本次开发环境与工具如下:IE9.0浏览器 + IE抓包插件HttpWatch +WIN7 64位系统 + VS2005 IDE + .NET 2.0框架本想上传HttpWatch抓包插件,但由于文件超 ...

  10. Php数据类型之整型详解

    php中支持的数据类型 在php中主要支持8种数据类型.和3中伪类型的一个形式.8种数据类型分为以下三3大类,第一个就是我们的标量类型,标量类型它只能存储单一数据,那第二大类就是我们的复合类型,第三个 ...