POJ 1797 Heavy Transportation(最大生成树/最短路变形)
| Time Limit: 3000MS | Memory Limit: 30000K | |
| Total Submissions: 31882 | Accepted: 8445 |
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
解题思路
Kruskal()
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1005;
struct Edge{
int u,v,w;
}edge[maxn*maxn/2];
int fa[maxn];
bool cmp(Edge a,Edge b)
{
return a.w > b.w;
}
int find(int x)
{
return fa[x] == x?fa[x]:fa[x] = find(fa[x]);
}
void Union(int x,int y)
{
int fx = find(x),fy = find(y);
if (fx != fy) fa[fx] = fy;
}
int main()
{
int tcase;
scanf("%d",&tcase);
for (int t = 1;t <= tcase;t++)
{
int n,m,res = 0x3f3f3f3f;
scanf("%d%d",&n,&m);
for (int i = 0;i <= n;i++) fa[i] = i;
for (int i = 0;i < m;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort(edge,edge + m,cmp);
for (int i = 0; i< m;i++)
{
Union(edge[i].u,edge[i].v);
if (find(1) == find(n))
{
res = edge[i].w;
break;
}
}
printf("Scenario #%d:\n",t);
printf("%d\n",res);
if (t != tcase) printf("\n");
}
return 0;
}
dijkstra()
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
struct Edge{
int u,v,w,nxt;
bool operator < (const Edge &a)const
{
return w < a.w;
}
}edge[maxn*maxn];
int tot = 0,head[maxn],dis[maxn];
bool vis[maxn];
void addedge(int u,int v,int w)
{
edge[tot] = (Edge){u,v,w,head[u]
};
head[u] = tot++;
}
void dijkstra(int st,int n)
{
Edge p;
priority_queue<Edge>que;
memset(dis,0,sizeof(dis));
memset(vis,false,sizeof(vis));
p.v = st;
p.w = INF;
dis[st] = INF;
que.push(p);
while (!que.empty())
{
p = que.top();
que.pop();
int u = p.v;
if (vis[u]) continue;
vis[u] = true;
for (int i = head[u];~i;i = edge[i].nxt)
{
int v = edge[i].v,w = edge[i].w;
if (dis[v] < min(dis[u],w))
{
dis[v] = min(dis[u],w);
p.v = v,p.w = dis[v];
que.push(p);
}
}
}
}
int main()
{
int tcase;
scanf("%d",&tcase);
for (int t = 1;t <= tcase;t++)
{
int n,m,u,v,w;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for (int i = 0;i < m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
dijkstra(1,n);
printf("Scenario #%d:\n",t);
printf("%d\n",dis[n]);
if (t != tcase) printf("\n");
}
return 0;
}
spfa()
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
struct Edge{
int u,v,w,nxt;
}edge[maxn*maxn];
int tot = 0,head[maxn],dis[maxn];
bool vis[maxn];
void addedge(int u,int v,int w)
{
edge[tot] = (Edge){u,v,w,head[u]
};
head[u] = tot++;
}
void spfa(int st,int ed)
{
memset(vis,false,sizeof(vis));
memset(dis,0,sizeof(dis));
queue<int>que;
dis[st] = INF;
que.push(st);
vis[st] = true;
while (!que.empty())
{
int u = que.front();
que.pop();
vis[u] = false;
for (int i = head[u];~i;i = edge[i].nxt)
{
int v = edge[i].v,w = edge[i].w;
if (min(dis[u],w) > dis[v])
{
dis[v] = min(dis[u],w);
if (!vis[v])
{
que.push(v);
vis[v] = true;
}
}
}
}
}
int main()
{
int tcase;
scanf("%d",&tcase);
for (int t = 1;t <= tcase;t++)
{
int n,m,u,v,w;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for (int i = 0;i < m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
spfa(1,n);
printf("Scenario #%d:\n",t);
printf("%d\n",dis[n]);
if (t != tcase) printf("\n");
}
}
POJ 1797 Heavy Transportation(最大生成树/最短路变形)的更多相关文章
- POJ 1797 Heavy Transportation (最大生成树)
题目链接:POJ 1797 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter pro ...
- POJ - 1797 Heavy Transportation 单源最短路
思路:d(i)表示到达节点i的最大能运输的重量,转移方程d(i) = min(d(u), limit(u, i));注意优先队列应该以重量降序排序来重载小于符号. AC代码 #include < ...
- poj 1797 Heavy Transportation(最大生成树)
poj 1797 Heavy Transportation Description Background Hugo Heavy is happy. After the breakdown of the ...
- POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径)
POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径) Description Background Hugo ...
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- POJ 1797 Heavy Transportation
题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- POJ 1797 Heavy Transportation SPFA变形
原题链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- POJ 1797 ——Heavy Transportation——————【最短路、Dijkstra、最短边最大化】
Heavy Transportation Time Limit:3000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64 ...
- POJ 1797 Heavy Transportation (最短路)
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 22440 Accepted: ...
随机推荐
- JS高程4.变量,作用域和内存问题(2)执行环境及作用域
1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为, 每个执行环境都有一个与之相关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 2.全局执行环境: 最外围的 ...
- JavaScript学习笔记5 之 计时器 & scroll、offset、client系列属性 & 图片无缝滚动
一.计时器 setInterval ( 函数/名称 , 毫秒数 )表示每经过一定的毫秒后,执行一次相应的函数(重复) setTimeout ( 函数/名称 , 毫秒数 ) 表示经过一定的毫秒后,只执行 ...
- iOS 生成二维码
首先先下载生成二维码的支持文件 libqrencode 添加依赖库 CoreGraphics.framework. QuartzCore.framework.AVFoundation.framewor ...
- ExtPB.Net:窗体应用技巧(2)在树形导航下打开弹出的win窗口
ExtPB.Net的demo程序有个树形导航菜单,里面的菜单打开的窗口放在右边的TabStrip控件中.我们可以设计win通过导航打开,但有时我们希望以弹出窗口的形式打开它,但怎么办呢?现在可以这样修 ...
- Augularjs-起步
今年项目的需要,开始琢磨研究前端开发,由于之前项目已经用Angularjs了,就顺其而然的继续沿用. 在使用Angularjs之前,先要准备好工具:Nodejs.npm.git.bower.fis 下 ...
- nginx 安全优化
http://nginx.org/en/docs/http/ngx_http_access_module.html 官网 1.允许特定的ip访问,拒绝特定ip server { listen 80; ...
- [原创]自己动手实现React-Native下拉框控件
因项目需要,自己动手实现了一个下拉框组件,最近得空将控件独立出来开源上传到了Github和npm. Github地址(求Star 求Star 求Star
- Linux下的TeXlive 2015 中文问题
Update: 今日突然发现,我的xeLaTeX编译生成的pdf中文字在TeXMaker内置viewer.evince下查看均无法显示中文,中文字显示为空白,英语正常:但FireFox.Chrome浏 ...
- 安装ArcGIS Engine 9.3
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6217003.html 准备: ArcGIS Engine 9.3.crack_for ...
- [LeetCode] Optimal Account Balancing 最优账户平衡
A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...