意甲冠军:

到n节点无向图,它要求从一个线1至n路径。你可以让他们在k无条,的最大值。如今要求花费的最小值。

思路:

这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些。spfa的本质是一种搜索算法,既然是搜索,就涉及到状态的转移。

在一般求最短路的spfa算法中,当到结点u时,对e(u,v)仅仅需做例如以下转移:if(d[v]>d[u]+w(e)) d[v]=d[u]+w(e)。在跟一般的情况下。到结点u,对e(u,v)需做多种转移。比方这题中要考虑让e免费和不让e免费两种情况,详细的请參考实现。

代码:

//poj 3662
//sepNINE
#include <iostream>
#include <queue>
using namespace std;
const int maxN=1024;
const int maxM=10024;struct Edge
{int v,w,next;
}edge[maxM*2];struct Node
{int u,used;
};
int n,p,k,e;
int head[maxN],dis[maxN][maxN],vis[maxN][maxN];void spfa(int s,int t,int k)
{queue<Node> Q;memset(vis,0,sizeof(vis));int i,j;for(i=1;i<=n;++i)for(j=0;j<=k;++j)dis[i][j]=INT_MAX;  Node x;x.u=s;x.used=0;dis[s][0]=0;vis[s][0]=1;Q.push(x);while(!Q.empty()){Node x=Q.front();int u=x.u,used=x.used;Q.pop();vis[u][used]=0;    for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v,w=edge[i].w;if(used+1<=k&&dis[v][used+1]>dis[u][used]){//让这条边免费,免费的边数used要+1dis[v][used+1]=dis[u][used];if(vis[v][used+1]==0){Node x;x.u=v;x.used=used+1;vis[x.u][x.used]=1;Q.push(x);                   }} if(dis[v][used]>max(dis[u][used],w)){//不让这条边免费。dis[v][used]为dis[u][used]和w中的最大值dis[v][used]=max(dis[u][used],w);if(vis[v][used]==0){Node x;x.u=v;x.used=used;vis[x.u][x.used]=1;Q.push(x);}}}}return ;
}int main()
{scanf("%d%d%d",&n,&p,&k);e=0;memset(head,-1,sizeof(head)); while(p--){int a,b,c;scanf("%d%d%d",&a,&b,&c);edge[e].v=b;edge[e].w=c,edge[e].next=head[a];head[a]=e++;edge[e].v=a;edge[e].w=c;edge[e].next=head[b];head[b]=e++;}spfa(1,n,k);int ans=INT_MAX;for(int i=0;i<=k;++i)ans=min(ans,dis[n][i]);if(ans==INT_MAX)printf("-1");elseprintf("%d",ans); return 0;
} 

poj 3662 Telephone Lines spfa算法灵活运用相关推荐

  1. poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)

    Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...

  2. POJ - 3662 Telephone Lines(分层图最短路)

    题目链接:点击查看 题目大意:在郊区有N座通信基站,P条双向电缆,第i条电缆连接基站Ai和Bi.特别的,1号基站是通信公司的总站,N号基站位于一座农场中.现在,农场主希望对通信线路进行升级,其中升级第 ...

  3. bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线(二分+SPFA)

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1761  Solve ...

  4. I won't tell you this is about graph theory----zjfc bellman-ford算法与spfa算法

    题目描述 To think of a beautiful problem description is so hard for me that let's just drop them off. :) ...

  5. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  6. [BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1806  Solve ...

  7. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  8. SPFA算法判断负权环(bfs_spfa,dfs_spfa)

    判断给定的有向图中是否存在负环. 利用 spfa 算法判断负环有两种方法: 1) spfa 的 dfs 形式,判断条件是存在一点在一条路径上出现多次. 2) spfa 的 bfs 形式,判断条件是存在 ...

  9. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解

     本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...

最新文章

  1. Django项目日志概述
  2. 【5】CCNA课堂第一天
  3. Python入门学习---第三天
  4. HOT!闲来无聊,总结了下10个作为网民不得不知道的网址
  5. Azkaban启动与激活命令
  6. GDCM:gdcm::Printer的测试程序
  7. [Vue 牛刀小试]:第八章 - 组件的基础知识
  8. Sphinx 文档例子
  9. Linux新硬盘的使用
  10. 20.卷1(套接字联网API)---广播
  11. Python基础练习题,含答案解析
  12. 简易理解设计模式之:组合模式——实现View中的树状结构
  13. 刘未鹏:怎样花两年时间去面试一个人
  14. 对嵌入式开发方向的一些思考:在物联网方向
  15. Opencv 中的向量类Vec
  16. ScrollView的android:scrollbarStyle属性详解
  17. Unity Particle System 制作刀光特效
  18. 无线通信基础无线信道的统计描述(二)
  19. Linux驱动学习--V4L2设备(二)subdev的ops介绍及media framework深入解析
  20. Dubbo 路由规则之条件路由

热门文章

  1. string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?
  2. python简单单元测试示范卷_Python 单元测试的简单示例
  3. Java学习总结:36(日期处理类)
  4. python 包用法_Python 基础教程之包和类的用法
  5. iOS 9 适配系列教程
  6. X5同层播放器应用实践
  7. 2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8
  8. github README.md教程
  9. 数据库与操作系统时区更改
  10. MongoDB 搭建副本集