POJ-3662 Telephone Lines---二分+最短路+最小化第k+1大
题目链接:
https://cn.vjudge.net/problem/POJ-3662
题目大意:
求一条路径从1到n使第k+1大的边最小。
解题思路:
二分答案mid,当原边权小于等于mid新边权为0,否则新边权为1.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define MID(l, r) (l + (r - l) / 2)
#define lson(o) (o * 2)
#define rson(o) (o * 2 + 1)
using namespace std;
typedef long long ll;
const int INF = 1e9 +;
const int maxn = 1e6 + ;
int n, m, k;
struct edge{
int u, v, w;
edge(int u, int v, int w):u(u), v(v), w(w){}
edge(){}
};
struct Heapnode
{
int d, u;
Heapnode(){}
Heapnode(int d, int u):d(d), u(u){}
bool operator <(const Heapnode & a)const
{
return d > a.d;
}
};
bool v[maxn];
int d[maxn]; int dijkstra(int s, int t, vector<edge>edges, vector<int>G[])
{
priority_queue<Heapnode>q;
for(int i = ; i <= n; i++)d[i] = INF;
d[s] = ;
memset(v, , sizeof(v));
q.push(Heapnode(, s));
while(!q.empty())
{
Heapnode now = q.top();
q.pop();
int u = now.u;
if(v[u])continue;
v[u] = ;
for(int i = ; i < G[u].size(); i++)
{
edge& e = edges[G[u][i]];
int v = e.v;
if(d[v] > d[u] + e.w)
{
d[v] = d[u] + e.w;
q.push(Heapnode(d[v], v));
}
}
}
return d[t];
} vector<edge>edges;
vector<int>G[maxn];
vector<edge>edges2;
void addedge(int u, int v, int w)
{
edges.push_back(edge(u, v, w));
int m = edges.size();
G[u].push_back(m - );
}
void init(int mid)
{
edges2.clear();
for(int i = ; i < edges.size(); i++)
{
edge& e = edges[i];
if(e.w <= mid)
{
edges2.push_back(edge(e.u, e.v, ));
}
else
{
edges2.push_back(edge(e.u, e.v, ));
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
int l = , r = , u, v, w;
while(m--)
{
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
r = max(r, w);
}
int ans = -;
while(l <= r)//l最开始要设置成0,不能设置成最小边,因为第k大可能为0
{
int mid = (l + r) / ;
init(mid);
int t = dijkstra(, n, edges2, G);
//cout<<mid<<" "<<t<<endl;
if(t <= k)
{
ans = mid;
r = mid - ;
}
else
{
l = mid + ;
}
}
cout<<ans<<endl;
return ;
}
POJ-3662 Telephone Lines---二分+最短路+最小化第k+1大的更多相关文章
- POJ 3662 Telephone Lines(二分+最短路)
查看题目 最小化第K大值. 让我怀疑人生的一题目,我有这么笨? #include <cstdio> #include <queue> #include <cstring& ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)
题意 Farmer John想从电话公司修一些电缆连接到他农场.已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接. 现给出P对电线杆距离Ai,Bi,Li表示A ...
- POJ 3662 Telephone Lines (二分+dijkstra)
题意: 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人. 该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话 ...
- (poj 3662) Telephone Lines 最短路+二分
题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total ...
- poj 3662 Telephone Lines dijkstra+二分搜索
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5696 Accepted: 2071 D ...
- POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7214 Accepted: 2638 D ...
- poj 3662 Telephone Lines
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7115 Accepted: 2603 D ...
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
随机推荐
- SimpleCalendar日历插件改版
先附上一张货真价实的效果图: 以上部分代码,为了适应我司项目的需求,原来插件源码大改(因为项目中下拉框用了select2,所以原来插件的下拉框就有问题了,在加上原来插件本身就有点问题,特别是农历 .节 ...
- C#实现局部峰值查找,功能对应Matlab中的findpeaks.m
相关算法的原理参考Ronny,地址:图像分析:投影曲线的波峰查找,这里感谢下原作者. 参照C++的代码实现,我用C#翻译了下,其实原理也很简单的,下面放相关实现代码: private double[] ...
- Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
不论应用是如何部署的,我们都期望能扑捉到应用的错误日志, 解决思路: 自己写代码处理异常拦截,甚至直接在main函数中写异常拦截. stderr重定向到某个文件里 使用 syscall.Dup2 第一 ...
- Map 模板
#include<stdio.h> #include<iostream> #include<map> using namespace std; typedef pa ...
- UOJ#400. 【CTSC2018】暴力写挂
传送门 看到要求两棵树的 \(lca\) 深度不太好操作 考虑枚举第二棵树的 \(lca\),这样剩下的都是只和第一棵树有关的 而注意到 \(dis(x,y)=d(x)+d(y)-2d(lca(x,y ...
- canvas中strokeRect的渲染问题>>strokeRect把一像素的边框渲染成两像素
> 结论写在头 var oC = document.getElementById('c1'); var oGC = oC.getContext('2d'); oGC.strokeRect(50, ...
- Vue.js小案例(2)
即时搜索 这个例子主要应用了vue.js的自定义过滤器,可以通过Vue.filter()注册一个全局过滤器,具体用法可以参考这里,vue.js也提供了一些内置过滤器. CSS代码: [v-cloak] ...
- HTML 的特殊字符转换转义符,的两种方法。
HTML 的特殊字符转换转义符,的两种方法. 方法一: function htmlEscape(str) { return String(str) .replace(/&/g, '&' ...
- VS2013中使用Git建立源代码管理
原文:http://blog.csdn.net/bodybo/article/details/38976549/ 第一次在VS2013中使用Git,也是第一次使用git,各种不熟悉.百度各种使用经验, ...
- C++ 判断进程是否存在
原文:http://blog.csdn.net/u010803748/article/details/53927977?locationNum=2&fps=1 一.判断指定程序名的进程是否存在 ...