poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军:
到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要+1
dis[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");
else
printf("%d",ans);
return 0;
}
poj 3662 Telephone Lines spfa算法灵活运用的更多相关文章
- (poj 3662) Telephone Lines 最短路+二分
题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7214 Accepted: 2638 D ...
- poj 3662 Telephone Lines
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7115 Accepted: 2603 D ...
- POJ 3662 Telephone Lines (分层图)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6785 Accepted: 2498 D ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- poj 3662 Telephone Lines dijkstra+二分搜索
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5696 Accepted: 2071 D ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...
- poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...
- POJ 3662 Telephone Lines (二分 + 最短路)
Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...
随机推荐
- JavaEE session机制
JavaEE session机制 Http协议: 在讲session之前,必须说下Http协议,HTTP是一个client和server端请求和应答的标准(TCP).由HTTPclient发起一个请求 ...
- hdu4280(最大流)
传送门:Island Transport 题意:有N个岛屿 M条无向路 每个路有一最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到最东的那个岛屿. 分析:无向图正反都加弧,权值一样,这题点多, ...
- BZOJ 1324 Exca 神剑 最小割
标题效果:鉴于加权值矩阵,带走一个地方的权利值之后,与其相邻的格儿童权利值变0.问多少可以取出到右值. 思维:Amber论文题目.不难建设,图着色.颜色从S连边,还有一种颜色向T连边.再把相邻的格子连 ...
- 基于Java的开源CMS系统选择(转)
CMS概述 对于网站CMS系统而言,基于PHP的是主流,如Drupal/Joomla在各个主流虚拟机提供商上都是标准配置,也被广泛使用. 但如果你拥有Java团队,或者项目目标是想建立一个企业网使用的 ...
- hdu2606(递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2606 题意: 用1*1,2*2,3*3,4*4的正方形填充4*n的矩形, 问有多少种不同填法. 分析 ...
- TreeSet排序
TreeSet的排序能够通过两种方法来实现: 1.通过TreeSet(Comparator<? super E> comparator) 构造方法指定TreeSet的比較器进行排序. 2. ...
- hdu1520(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:举办一个party,候选人当中有很多人之间有上下级关系,求没有直接上下级的最多的人数. 分 ...
- 一起来开发Android的天气软件(四)——使用Gson解析数据
离上一篇文章过去才4.5天,我们赶紧趁热打铁继续完毕该系列的天气软件的开发. 承接上一章的内容使用Volley实现网络的通信.返回给我们的是这一串Json数据{"weatherinfo&qu ...
- JAVA 根据经纬度算出附近的正方形的四个角的经纬度
/** * * @param longitude 经度 * @param latitude 纬度 * @param distance 范围(米) * @return */ public static ...
- php如何判断用户是从指定页面跳转进来的
$_SERVER['HTTP_REFERER']下'HTTP_REFERER' 引导用户代理到当前页的前一页的地址(如果存在).由 user agent 设置决定.并不是所有的用户代理都会设置该项,有 ...