题目链接: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>的更多相关文章

  1. POJ--1797 Heavy Transportation (最短路)

    题目电波: POJ--1797 Heavy Transportation n点m条边, 求1到n最短边最大的路径的最短边长度 改进dijikstra,dist[i]数组保存源点到i点的最短边最大的路径 ...

  2. POJ1797 Heavy Transportation 【Dijkstra】

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 21037   Accepted:  ...

  3. (Dijkstra) POJ1797 Heavy Transportation

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 53170   Accepted:  ...

  4. POJ1797 Heavy Transportation —— 最短路变形

    题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K T ...

  5. [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)

    传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...

  6. POJ 1797 Heavy Transportation (最大生成树)

    题目链接:POJ 1797 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter pro ...

  7. (POJ 1797) Heavy Transportation 最大生成树

    题目链接:http://poj.org/problem?id=1797 Description Background Hugo Heavy is happy. After the breakdown ...

  8. POJ1797 Heavy Transportation

    解题思路:典型的Kruskal,不能用floyed(会超时),上代码: #include<cstdio> #include<cstring> #include<algor ...

  9. POJ1797 Heavy Transportation (堆优化的Dijkstra变形)

    Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...

随机推荐

  1. 怎么用Python写一个三体的气候模拟程序

    首先声明一下,这个所谓的三体气候模拟程序还是很简单的,没有真的3D效果或数学模型之类的,只不过是一个文字表示的模拟程序.该程序的某些地方可能不太严谨,所以也请各位多多包涵. 所谓三体气候模拟,就是将太 ...

  2. 用ABAP 生成二维码 QR Code

    除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成 ...

  3. 对JS中事件委托的理解

    什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义:利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. 使 ...

  4. 关于Java序列化的问题你真的会吗?

    引言 在持久化数据对象的时候我们很少使用Java序列化,而是使用数据库等方式来实现.但是在我看来,Java 序列化是一个很重要的内容,序列化不仅可以保存对象到磁盘进行持久化,还可以通过网络传输.在平时 ...

  5. sentinel 规则持久化到nacos

    问题描述 Sentinel Dashboard中添加的规则是存储在内存中的,只要项目一重启规则就丢失了 此处将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中: 后面研 ...

  6. openwrt sdk 添加软件包 Makefile 写法

    参考 https://openwrt.org/start?id=docs/guide-developer/packages ,英文稍好点的自己看吧,我写出来也就是方便,英文不好的人看. 软件包的来源, ...

  7. OpenGL 实践之贝塞尔曲线绘制

    说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图. 以下两个是比较经典的动图了. 二阶贝塞尔曲线: 三阶贝塞尔曲线: 由于在工作中经常要和贝塞尔曲线打交道,所以简 ...

  8. 【小程序】---- input获得焦点时placeholder重影BUG

    问题小程序的input组件有个自身的bug,即当输入框获取焦点时placeholder内容会出现重影现象. 解决思路原理:将placeholder内容单独写在另外的标签里,控制其显示隐藏.操作:将代表 ...

  9. Oracle 11g rac开启归档

    Oracle 11g rac开启归档 查看目前归档状态 #节点1 ykws1 SQL> archive log list; Database log mode No Archive Mode A ...

  10. ggplot2练习

    图源于电力电子课本65页——电容滤波的单相不可控整流电路. f<-function(w,d) { l<-w/sqrt(w^2+1)*exp(-atan(w)/w)*exp(-d/w) r& ...