题意是这种,给你一个无向图,

每条边有距离和花费,

假设从第一个点到末点的最短路不唯一,

则输出最短路长度以及最少的花费。

否则输出长度和花费即可。

用传说中的链式向前星优化了一下边的存储,

写了个spfa解这道题。

链式向前星,是个静态链表。

是这样实现的,用一个数组box存放

跟全部起始点相连的最后一个存入的终点在

side结构数组中的下标是,

然后用side[i].next存放同样起始点的下一个终点。

我的代码例如以下:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int cnt,num_dot,num_side,st,ed,dis[1010],cos[1010],box[1010];
struct node
{
int to,next,d,c;
}side[200010];
void add(int from,int to,int d,int c)
{
side[cnt].to=to;
side[cnt].d=d;
side[cnt].c=c;
side[cnt].next=box[from];
box[from]=cnt++;
}
void init()
{
int s,e,d,c;
cnt=0;
memset(box,-1,sizeof(box));
for(int i=0;i<num_side;i++)
{
scanf("%d%d%d%d",&s,&e,&d,&c);
add(s,e,d,c);
add(e,s,d,c);
}
scanf("%d%d",&st,&ed);
}
void spfa()
{
int mid;
bool iq[1010];
queue<int>qq;
memset(iq,0,sizeof(iq));
memset(dis,127,sizeof(dis));
memset(cos,127,sizeof(cos));
iq[st]=1;
dis[st]=0;
cos[st]=0;
qq.push(st);
while(qq.size())
{
mid=qq.front();
qq.pop();
iq[mid]=0;
for(int i=box[mid];i>-1;i=side[i].next)
{
if(dis[side[i].to]>dis[mid]+side[i].d)
{
dis[side[i].to]=dis[mid]+side[i].d;
cos[side[i].to]=cos[mid]+side[i].c;
if(!iq[side[i].to])
{
qq.push(side[i].to);
iq[side[i].to]=1;
}
}
else if(dis[side[i].to]==dis[mid]+side[i].d&&cos[side[i].to]>cos[mid]+side[i].c)
{
cos[side[i].to]=cos[mid]+side[i].c;
if(!iq[side[i].to])
{
qq.push(side[i].to);
iq[side[i].to]=1;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&num_dot,&num_side)&&(num_dot!=0||num_side!=0))
{
init();
spfa();
printf("%d %d\n",dis[ed],cos[ed]);
}
}

hdu3790最短路径问题的更多相关文章

  1. HDU-3790 最短路径问题

    最短路径问题 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  2. hdu-3790最短路径问题

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  3. HDU-3790最短路径问题,第十遍终于过了~

    最短路径问题                                                                   Time Limit: 2000/1000 MS (J ...

  4. hdu3790最短路径问题 (用优先队列实现的)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  5. hdu-3790 最短路径问题(双重权值)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input ...

  6. HDU-3790 最短路径问题(双重权值)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  7. hdu3790最短路径问题(BFS+优先队列)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  8. hdu-3790 最短路径问题---dijkstra两重权值

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到 ...

  9. 最短路径-Dijkstra+Floyd+Spfa

    Dijkstra算法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra ...

随机推荐

  1. 使用xml和java代码混合控制UI界面

    main.xml.................... <?xml version="1.0" encoding="utf-8"?> <Li ...

  2. 开发指南专题4:JEECG高速微云开发平台--JEECG开发环境的搭建

    开发指南专题4:JEECG微云高速开发平台开发环境搭建 1. JEECG开发环境搭建 JEECG推荐的开发环境为Myeclipse8.5/Eclipse3.7+JDK1.6+Tomcat6.0 1.1 ...

  3. 吐槽CSDN编辑

    Perface 近期喜欢上了markdown.我认为它就是一些HTML标签的快捷键,用一些符号来取代标签,易学易读易用,何乐而不为呢?近期也喜欢用印象笔记来让我的记忆永存,确实它强大的收集能力让我迷上 ...

  4. PHP上传文件超过了最大文件大小限制导致无法上传成功

    最近的研究<HeadFirst PHP & MySQL>第一本书5章"使用存储在文件中的数据",难道当一个文件上传应用程序,发生了错误.即,文件不能成功上传.这 ...

  5. Linux iptables简单配置

    #!/bin/sh#modprobe ipt_MASQUERADEmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables -Fiptables -t ...

  6. ASPF简介

    ASPF是一种应用层状态检测技术,它通过与NAT和ALG等技术的组合应用,实现对应用层协议状态的处理和检测. 1.1  产生背景 随着计算机技术和网络技术的普及,网络安全问题也越来越得到关注.防火墙作 ...

  7. Projecet客户端登陆无法通过验证

    客户反映使用Project客户端登陆project服务器的时候,只有域管理员账户才能够登陆成功,其他的账户登陆都无法验证通过,无论是https的方式还是客户端的方式,但是域账户登陆计算机是可以登陆成功 ...

  8. SVN的svnlook命令

    svnlook命令集(zhuanzai) 2011-12-08 17:00:30|  分类: System and CVS|字号 订阅     svnlook 名称 svnlook author — ...

  9. .net数据根据字段进行分类(linq语句)

    var items = List<实体>; var models = items.GroupBy(r => r.分类字段).ToDictionary(d => d.Key, d ...

  10. SVNKIT一段代码的分析

    打印SVNkit版本库中的结构: 函数如下: 调用方法如下: listEntries(repository, ""); System.out.println("XXXXX ...