题意:

有编号1~P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费。

有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1。 求所有人来回的最小费用之和。

思路:

1.两次SPFA,也就是巧妙的将路线进行了翻转。

code 1:(数据较大,不能用二维数组,用的邻接表)

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXN 1000000
#define INF 0x3f3f3f3f
struct node
{
int now,to,w;
}edge[MAXN];//记录每条边的信息,起始点,终止点,权值
int first[MAXN],next[MAXN];
int dis[MAXN],vis[MAXN];
int n,m;
void turnup()//反转图
{
int i,k;
for(i = ; i<=m; i++)
first[i] = next[i] = -;
for(i = ; i<m; i++)
{
k= edge[i].to;
next[i] = first[k];
first[k] = i;
}
}
void SPFA2(int start)
{
int i;
for(i = ; i<=n; i++)
dis[i] = INF;
dis[start] = ;
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(start);
while(!Q.empty())
{
start = Q.front();
Q.pop();
vis[start] = ;
i = first[start];
while()
{
int to = edge[i].now;
if(dis[to]>dis[start]+edge[i].w)
{
dis[to]=dis[start]+edge[i].w;
if(!vis[to])
{
vis[to] = ;
Q.push(to);
}
}
i = next[i];
if(i==-)
break;
}
}
return;
}
void SPFA1(int start)
{
int i;
for(i = ; i<=n; i++)
dis[i] = INF;
dis[start] = ;
memset(vis,,sizeof(vis));
queue<int> Q;
Q.push(start);
while(!Q.empty())
{
start = Q.front();
Q.pop();
vis[start] = ;
i=first[start];
while()
{
int to = edge[i].to;
if(dis[to]>dis[start]+edge[i].w)
{
dis[to]=dis[start]+edge[i].w;
if(!vis[to])
{
vis[to] = ;
Q.push(to);
}
}
i = next[i];
if(i==-)
break;
}
}
return;
}
int main()
{
int t,sum,i;
scanf("%d",&t);
while(t--)
{
sum = ;
scanf("%d%d",&n,&m);
for(i=; i<m; i++)
first[i]=next[i]=-;
for(i=; i<m; i++)
{
scanf("%d%d%d",&edge[i].now,&edge[i].to,&edge[i].w);
next[i]=first[edge[i].now];
first[edge[i].now]=i;
}
SPFA1();
for(i = ; i<=n; i++)
sum+=dis[i];
turnup();
SPFA2();
for(i = ; i<=n; i++)
sum+=dis[i];
printf("%d\n",sum);
}
return ;
}

这里SPFA 可以优化,关于SPFA的优化:

SLF:Small Label First 策略。

  实现方法是,设队首元素为 i,队列中要加入节点 j,在 dj<=di 时加到队首而不是队尾,否则和普通的 SPFA 一样加到队尾。

LLL:Large Label Last 策略。

  实现方法是,设队列 Q 中的队首元素为 i,距离标号的平均值为 avg(d),每次出队时,若 di>avg(d),把 i 移到队列末尾,如此反复,直到找到一个 i 使 ,di<=avg(d)将其出队。

HDU 1535 Invitation Cards(SPFA,及其优化)的更多相关文章

  1. hdu 1535 Invitation Cards(SPFA)

    Invitation Cards Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) T ...

  2. [HDU 1535]Invitation Cards[SPFA反向思维]

    题意: (欧洲人自己写的题面就是不一样啊...各种吐槽...果断还是看晕了) 有向图, 有个源叫CCS, 求从CCS到其他所有点的最短路之和, 以及从其他所有点到CCS的最短路之和. 思路: 返回的时 ...

  3. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  4. HDU - 1535 Invitation Cards 前向星SPFA

    Invitation Cards In the age of television, not many people attend theater performances. Antique Come ...

  5. hdu 1535 Invitation Cards(spfa)

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...

  7. HDU 1535 Invitation Cards (POJ 1511)

    两次SPFA. 求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换.可是这个有1000000个点.矩阵开不了. d1[]为 1~N 的最短路. 将全部边的 邻点 交换. d ...

  8. HDU 1535 Invitation Cards (最短路)

    题目链接 Problem Description In the age of television, not many people attend theater performances. Anti ...

  9. hdu 1535 Invitation Cards (最短路径)

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

随机推荐

  1. 文本导出到pdf文件(使用QPrinter和QPainter和QTextDocument)

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

  2. Solr搜索结果说明

    在admin页面,输入相关内容后,会返回xml格式的内容.说明如下: [html] view plaincopy <?xml version="1.0" encoding=& ...

  3. Linux解压乱码

    .向系统添加windows下的字符编码: sudo vim /var/lib/locales/supported.d/local 添加一下编码: zh_CN.GBK GBK zh_CN.GB2312 ...

  4. [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢

    一,什么是TicTacToe(井字棋)   本 游戏 为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿 ...

  5. Fragment保持状态切换,fragment状态切换

    在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...

  6. c语言,指针与数组--指针与二维数组2

    指向一维数组的指针   char (*p)[10] ;指向一维数组的指针类型 typedef  char(*TYPE_P2ARRAY)[10]  ;   该指针可以指向数组 ,且使用起来效果节本相同, ...

  7. Net MVC轻量级分页控件

    JPager.Net MVC超好用轻量级分页控件   JPager.Net  MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象. JPager.Net  MVC好用的轻量级分页控件,实现 ...

  8. solr总结 第六部分:solr查询语法

    1.基本查询语法 q:全文查询.schema.xml里面定义了如下两块.eg q=ibm即表示org_name或者org_weisite里面出现ibm的document都可以被匹配到.KeyWords ...

  9. jQuery.mobile.changePage() | jQuery Mobile API Documentation

    jQuery.mobile.changePage() | jQuery Mobile API Documentation <script> $.mobile.changePage( &qu ...

  10. HTML - HTML Commonly Used Character Entities

    HTML Entities Some characters are reserved in HTML. It is not possible to use the less than (<) o ...