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: ...
随机推荐
- 【原】低版本MyEclipse整合高版本Tomcat
[使用工具] 1.MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller 2.Tomcat 7.0 [问题描述] 直接在MyEclipse中整合,因为这个版本的MyEc ...
- iOS之按钮出现时加一个动画效果
//按钮出现时的动画效果 + (void)buttonAnimation:(UIButton *)sender { CAKeyframeAnimation *animation = [CAKeyfra ...
- iOS之判断字符串是否为空字符的方法
- (BOOL) isBlankString:(NSString *)string { if (string == nil || string == NULL) { return YES; } if ...
- Visual Studio2015 常用快捷键
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...
- 前端开发--ppt展示页面跳转逻辑实现
1. 工程地址:https://github.com/digitalClass/web_page 网站发布地址: http://115.28.30.25:8029/ 2. 今天遇到一个小问题, 同组的 ...
- Hibernate 系列 03 - 使用Hibernate完成持久化操作
引导目录: Hibernate 系列教程 目录 康姆昂,北鼻,来此狗.动次打次,Hibernate继续走起. 目录: 使用Hibernate实现按主键查询 使用Hibernate实现数据库的增.删.改 ...
- 如何在mac上用终端打开XAMPP自带的MySQL
注:1.本文未经博主同意,不得转载! 2.所有终端语句都分行显示,以免大家看错: 直接开始,过程中对每一步可能出现的错误都进行了说明. 1.安装好xampp,然后打开终端,输入: mysql -u r ...
- 机器学习实战笔记(Python实现)-06-AdaBoost
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(三)(联想)
萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码. Orz 一样地先放上运行结果: test1 ID : char : 件 w ...
- Ubuntu Server 设置PPTP客户端连接
安装PPTP客户端 apt-get install pptp-linux 设置连接账号信息 sudo vim /etc/ppp/chap-secrets 其中$login_name是登录名:$pass ...