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 ...
随机推荐
- servletResponse outputStream输出数据
package response; import java.io.IOException;import java.io.OutputStream; import javax.servlet.Servl ...
- andorid中发送短信页面以及邮件发送
跳转到发送短信页面 Uri smsToUri = Uri.parse("smsto://10086"); Intent mIntent = new Intent( android. ...
- 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)
(应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...
- RocksDB
RocksDB RocksDB is a high performance[1][2][3][4][5] embedded database for key-value data. It is a f ...
- adjA=(detA)A-1
A–>adjA 连续性 反函数
- substr扩展版:支持中文字符串截取
function d_substr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_e ...
- 【学习笔记】快速傅里叶变换(FFT)
[学习笔记]快速傅里叶变换 学习之前先看懂这个 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理--gzy hhh开个玩笑. 讲一下\(FFT\) ...
- 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
解决方案,把文件用Editplus打开,UTF-8+BOM编码的文件转为普通的UTF-8文件
- Nginx + Tomcat 应用证书启用 SSL
第一部分 简述 - 附:相关概念 1 Nginx 是什么? - 2 Tomcat 是什么? - 3 SSL 是什么? Secure Sockets Layer,现在应该叫"TLS" ...
- Java for LeetCode 097 Interleaving String 【HARD】
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 ...