POJ1797(dijkstra求最短最长边)
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 26442 | Accepted: 7044 |
Description
Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight.
Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know.
Problem
You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.
Input
Output
Sample Input
1
3 3
1 2 3
1 3 4
2 3 5
Sample Output
Scenario #1:
4
题意:求结点1到结点n的所有每个路径中的最小承载量中的最大值(与:所有路径中最长边的最短值相区别)。
/*
dijkstra Accepted 4316 KB 391 ms
*/
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
int mp[MAXN][MAXN];
int V,E; int dijkstra(int s)
{
int vis[MAXN];
memset(vis,,sizeof(vis));
int d[MAXN];//代表最大承载量
for(int i=;i<=V;i++) d[i]=mp[s][i]; int n=V;
while(n--)
{
int maxcost,k;
maxcost=;
for(int i=;i<=V;i++)
{
if(!vis[i]&&d[i]>maxcost)
{
k=i;
maxcost=d[i];
}
} vis[k]=;
for(int i=;i<=V;i++)
{
if(!vis[i]&&d[i]<min(d[k],mp[k][i]))
{
d[i]=min(d[k],mp[k][i]);
}
}
}
return d[V];
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
memset(mp,,sizeof(mp));//承载量初始化为0
scanf("%d%d",&V,&E);
for(int i=;i<E;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
mp[u][v]=mp[v][u]=cost;
} printf("Scenario #%d:\n",cas);
printf("%d\n\n",dijkstra());
} return ;
}
/*
floyd Time Limit Exceeded
*/
#include"cstdio"
#include"algorithm"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
int mp[MAXN][MAXN];
int main()
{
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
int V,E;
scanf("%d%d",&V,&E);
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
if(i==j) mp[i][j]=;
else mp[i][j]=INF;
for(int i=;i<E;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
mp[u][v]=mp[v][u]=cost;
} for(int k=;k<=V;k++)
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
if(mp[i][k]<mp[i][j]&&mp[k][j]<mp[i][j])
mp[i][j]=max(mp[i][k],mp[k][j]); printf("Scenario #%d:\n",cas);
printf("%d\n\n",mp[][V]);
} return ;
}
/*
堆优化dijkstra 1797 Accepted 5224K 329MS
*/
#include"cstdio"
#include"queue"
#include"vector"
#include"algorithm"
#include"cstring"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
struct Edge{
int to,cost;
Edge(int to,int cost)
{
this->to=to;
this->cost=cost;
}
friend bool operator<(const Edge &a,const Edge &b)
{
return a.cost < b.cost;
}
};
int V,E;
vector<int> G[MAXN];
int mp[MAXN][MAXN];
int dijkstra(int s)
{
int d[MAXN];
priority_queue<Edge> que; for(int i=;i<=V;i++)
{
que.push(Edge(i,mp[s][i]));
d[i]=mp[s][i];
}
while(!que.empty())
{
Edge e=que.top();que.pop();
if(e.to==V) return e.cost; int v=e.to;
if(d[v]>e.cost) continue;
for(int i=;i<G[v].size();i++)
{
int u=G[v][i];
if(d[u]<min(d[v],mp[v][u]))
{
d[u]=min(d[v],mp[v][u]);
que.push(Edge(u,d[u]));
}
}
}
return -;
}
int main()
{ int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
memset(mp,,sizeof(mp));
scanf("%d%d",&V,&E);
for(int i=;i<=V;i++)
{
G[i].clear();
}
for(int i=;i<E;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
G[u].push_back(v);
G[v].push_back(u);
mp[u][v]=mp[v][u]=cost;
}
printf("Scenario #%d:\n",cas);
printf("%d\n\n",dijkstra());
} return ;
}
二分+bfs
/*
1797 Accepted 1420K 329MS C++
*/
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int MAXN=;
const int INF=0x3f3f3f3f;
struct Edge{
int to,w;
Edge(){}
Edge(int to,int w)
{
this->to=to;
this->w=w;
}
};
int n,m;
vector<Edge> arc[MAXN];
int src,ter,vis[MAXN];
bool bfs(int limit)
{
memset(vis,,sizeof(vis));
queue<int> que;
que.push(src);
vis[src]=;
while(!que.empty())
{
int u=que.front();que.pop();
if(u==ter) return true;
for(int i=,size=arc[u].size();i<size;i++)
{
Edge e=arc[u][i];
if(!vis[e.to]&&limit<=e.w)
{
vis[e.to]=;
que.push(e.to);
}
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) arc[i].clear();
src=;
ter=n;
for(int i=;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
arc[u].push_back(Edge(v,w));
arc[v].push_back(Edge(u,w));
}
int l=,r=INF;
while(r-l>)
{
int mid=(l+r)/;
if(bfs(mid))
{
l=mid;
}
else
{
r=mid;
}
}
printf("Scenario #%d:\n",cas);
printf("%d\n\n",l);
}
return ;
}
POJ1797(dijkstra求最短最长边)的更多相关文章
- ACM - 最短路 - AcWing 849 Dijkstra求最短路 I
AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- 逆FizzBuzz问题求最短序列
问题描述 FizzBuzz问题:一个大于0的自然数能整除3,将输出“Fizz”:能整除5,将输出“Buzz”:能整除3和5,将输出“FizzBuzz”:否则输出自己. 逆FizzBuzz问题最短序列: ...
- CF 427D Match & Catch 求最短唯一连续LCS
题目来源:CF 427D Match & Catch 题意:给出2个字符串 求最短的连续的公共字符串 而且该字符串在原串中仅仅出现一次 思路:把2个字符串合并起来求height 后缀数组hei ...
- The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。
/** 题目:The Super Powers UVA 11752 链接:https://vjudge.net/contest/154246#problem/Y 题意:求无符号长整形以内的数满足至少可 ...
- 关于dijkstra求最短路(模板)
嗯.... dijkstra是求最短路的一种算法(废话,思维含量较低, 并且时间复杂度较为稳定,为O(n^2), 但是注意:!!!! 不能处理边权为负的情况(但SPFA可以 ...
- Aizu-2249 Road Construction(dijkstra求最短路)
Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...
- 牛客小白月赛6 C 桃花 dfs 求树上最长直径
链接:https://www.nowcoder.com/acm/contest/136/C来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
- 状压dp,松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间。
UVA10944 松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间. #include<iostream> #include<cstdio> #include<al ...
随机推荐
- HTML中Select的使用详解
<html><head><SCRIPT LANGUAGE="JavaScript"><!--//oSelect 列表的底部添加了一个新选项 ...
- Rider
听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider 本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只 ...
- cesium学习--初识
一.Cesium 官方介绍:CesiumJS是一个开源的JavaScript库,用于世界级的3D地球仪和地图.任务是为静态和时间动态的内容创建领先的3D地球和地图,具有最好的性能.精度.视觉质量.平台 ...
- tao.opengl+C#绘制三维模型
一.tao.Opengl技术简介 Opengl是一种C风格的图形库,即opengl中没有类和对象,只有大量的函数.Opengl在内部就是一个状态机,利用不同的函数来修改opengl状态机的状态,以达到 ...
- php类中const
常量 const 在类里面定义常量用 const 关键字,而不是通常的 define() 函数. 语法: const constant = "value"; 例子: <?ph ...
- ios 添加全屏返回手势
1 建立导航控制器 2.导航控制器添加如下代码 - (void)viewDidLoad { [super viewDidLoad]; id target = self.interactivePopGe ...
- 《Java设计模式》之构建者模式
概述: 构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来.使得相同的构建过程能够创建不同的表示,又称为生成器模式. Bu ...
- vue入门(二) 让axios发送表单形式数据
(一) 使用 axios vue-axios qs 1.qs是必不可少的插件 npm install --save axios vue-axios qs 2.安装完成后,在main.js插入以下代码 ...
- GOLANG 1.9 语言规范
GOLANG 1.9 语言规范 - CSDN博客 https://blog.csdn.net/libing_thinking/article/details/77671607
- On Using Very Large Target Vocabulary for Neural Machine Translation Candidate Sampling Sampled Softmax
[softmax分类器的加速器] https://www.tensorflow.org/api_docs/python/tf/nn/sampled_softmax_loss This is a fas ...