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: ...
随机推荐
- SharePoint2016合规性策略中心
如何开启 1. 打开sp2016的管理中心,找到[应用程序]-[创建网站集],如下图: 创建完毕后,如下图: 2. 开启搜索服务并进行爬网,否则进行网站集配置的,无法搜索到网站集 打开管理中心的[管理 ...
- iOS基本数据库存储方式 - CoreData
CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...
- 【代码笔记】iOS-验证手机号,邮箱,车牌号是否合法
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- 两listview联动
package com.mttz; import java.util.ArrayList;import java.util.List; import com.mttz.adapter.CaiDanAD ...
- redis主从
安装: tar -zxvf redis-3.2.6.tar.gz cd redis-3.2.6make make installcd utils/ sh install_server.sh 主: 配置 ...
- Windows批处理:自动开关程序
公司有台14年组装的PC,时常无故重启,所以编写了个然并卵的批处理来测试稳定性. 打开程序.bat @echo off title Start Software color 2F : "C: ...
- Spring 01基础
一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...
- Introducing Holographic Emulation
Holographic Emulation is a new feature that vastly reduces iteration time when developing holographi ...
- 威佐夫博弈(Wythoff Game)
有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者. ...
- 转: CentOS 安装 SVN1.8 客户端
from: http://blog.csdn.net/clementad/article/details/46898091 CentOS 安装SVN客户端 标签: subversionrpmcent ...