[poj1797]Heavy Transportation<最大生成树prim&kruskal>
题目链接:http://poj.org/problem?id=1797
题意:给定n个点,m条边,每条边连接两点切有权值。求点1到点n的路径的上的最小边的值最大。。。
翻别人博客找到的题,方法挺多的,直接跑一个最大生成树就行,或者是一个最短路算法也行
我自己用了prim和kruskal 的方法来做
虽然用最短路也可以轻松过,但是我还是选择了生成树
prim
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<queue>
#define maxn 1005
using namespace std;
struct node{
int u,v,w,nxt;
}e[maxn*maxn]; int n,m,low[maxn],mst[maxn],head[maxn],vis[maxn],ans; int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int tot;
void adde(int u,int v,int w){
e[tot]=(node){u,v,w,head[u]};
head[u]=tot++;
} void first(){
ans=;
memset(low,,sizeof(low));
memset(mst,,sizeof(mst));
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));tot= ;
} void prim(int num){
int u=,maxx=-ans,maxid;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].v;
mst[v]=u;low[v]=e[i].w;
}vis[u]=;
int nn=n-;
while(nn--){
for(int i=;i<=n;i++){
if(low[i]&&mst[i]){
if(low[i]>maxx){
maxx=low[i];maxid=i;
}
}
}
ans=min(maxx,ans);maxx=;
low[maxid]=;mst[maxid]=;vis[maxid]=;
if(maxid==n)break;
for(int i=head[maxid];i!=-;i=e[i].nxt){
int v=e[i].v;
if(e[i].w>low[v]&&!vis[v]){
mst[v]=maxid;low[v]=e[i].w;
}
}
}
printf("Scenario #%d:\n%d\n\n",num,ans);
} int main(){
int T;T=read();int h=;
while(T--){
first();h++;
n=read();m=read();
for(int i=;i<=m;i++){
int u,v,w;
u=read();v=read();w=read();
adde(u,v,w);adde(v,u,w);
}
prim(h);
}
}
kruskal
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<queue>
#define maxn 1005
using namespace std; struct node{
int u,v,w,nxt;
}e[maxn*maxn]; int n,m,fa[maxn],sum,ans,vis[maxn]; int tot;
void adde(int u,int v,int w){
e[tot]=(node){u,v,w};
tot++;
} void first(){
ans=;sum=;tot=;
for(int i=;i<=n;i++)fa[i]=i;
} int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
} int comp(const void*a,const void*b){
return (*(struct node*)a).w<(*(struct node*)b).w?:-;
} int read(){
int xx=,ff=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')ff=-;ch=getchar();}
while(ch>=''&&ch<=''){xx=xx*+ch-'';ch=getchar();}
return xx*ff;
} int can(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy)return ;
return ;
} int main(){
int T,k=;T=read();
while(T--){
k++;n=read();m=read();
first();memset(vis,,sizeof(vis));
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
adde(u,v,w);adde(v,u,w);
}e[].w=ans;
qsort(e+,tot+,sizeof(e[]),comp);
for(int i=;i<=tot;i++){
int u=e[i].u,v=e[i].v;
int fu=find(u),fv=find(v);
if(fu!=fv){
fa[fv]=fu;ans=min(ans,e[i].w);
}
if(can(,n)){
printf("Scenario #%d:\n%d\n\n",k,ans);break;
}
}
}
}
PS:注意一下输出的格式,容易错的。
还有就是判断算法的结束条件,并不是当所有的点都加入了,而是当1能到n 的时候就可以跳出了
[poj1797]Heavy Transportation<最大生成树prim&kruskal>的更多相关文章
- POJ--1797 Heavy Transportation (最短路)
题目电波: POJ--1797 Heavy Transportation n点m条边, 求1到n最短边最大的路径的最短边长度 改进dijikstra,dist[i]数组保存源点到i点的最短边最大的路径 ...
- POJ1797 Heavy Transportation 【Dijkstra】
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 21037 Accepted: ...
- (Dijkstra) POJ1797 Heavy Transportation
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 53170 Accepted: ...
- POJ1797 Heavy Transportation —— 最短路变形
题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)
传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...
- POJ 1797 Heavy Transportation (最大生成树)
题目链接:POJ 1797 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter pro ...
- (POJ 1797) Heavy Transportation 最大生成树
题目链接:http://poj.org/problem?id=1797 Description Background Hugo Heavy is happy. After the breakdown ...
- POJ1797 Heavy Transportation
解题思路:典型的Kruskal,不能用floyed(会超时),上代码: #include<cstdio> #include<cstring> #include<algor ...
- POJ1797 Heavy Transportation (堆优化的Dijkstra变形)
Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...
随机推荐
- Hexo站点Next主题添加google adsense广告
本文转载自: https://www.93bok.com 前言 无意之间看到了google adsense的广告,于是就想到给我的站点也弄一个,本来以为是很简单的事,参考了很多资料,终于是部署成功了, ...
- py基础之模块与包
'''模块:当代码越来越多时,将所有代码放入一个文件中便会无法维护,所以放到多个文件中去,这样每一个py文件就是一个模块 包:模块越来越多时容易重名,便将模块放入不同的包中,每个包中必须有一个__in ...
- web页面上展示图片时,图片不显示,报错:ERR_CONTENT_LENGTH_MISMATCH
问题描述 前端页面加载css,和js文件的时候,经常出现ERR_CONTENT_LENGTH_MISMATCH的报错情况. 查找问题 在单独打开hearder中css,js的网络地址是能打开的 ...
- 前端开发--nginx番外篇
Centos7下Nginx开发使用(背景: 阿里云ECS Centos7) 安装和启动 安装教程 Centos7安装Nginx实战 需要主意的如下: 文中第四步 4.配置编译参数命令:(可以使用./c ...
- day1 执行用例
故事1 今天的工作,是执行已写好的"回馈"模块用例 每个子模块的用例都有优先级之分 肯定要先进行通过性测试,验证正常流 因此,我优先执行各个子模块优先级最高的那条用例,进行通过性测 ...
- Robotutor Scratch3.0 在线编程平台上线!
终于,Scratch3.0在线编程平台上线了,不容易阿! 欢迎试用 https://scratch.robotutor.cn 欢迎交流,WeChat ID: iamlinweidong
- CSS的SVG学习
SVG 意为可缩放矢量图形(Scalable Vector Graphics). HTML三种方法导入svg文件: <html xmlns:svg="http://www.w3.org ...
- span(行级元素)在不定高的div(块级元素)中垂直居中的方法
设置父级元素: align-items: center; display: flex;
- centos7安装部署opentsdb2.4.0
写在前面 安装HBase 在HBase中创建表结构 安装配置并启动opentsdb 写在前面 最近因为项目需要在读opentsdb的一部分源码,后面会做个小结分享出来.本人是不大喜欢写这种安装部署的文 ...
- MQTT抓包分析
1. 概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该 ...