Time Limit: 8000MS   Memory Limit: 262144K
Total Submissions: 17538   Accepted: 5721

Description

In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitation cards with all the necessary information and with the programme. A lot of students were hired to distribute these invitations among the people. Each student volunteer has assigned exactly one bus stop and he or she stays there the whole day and gives invitation to people travelling by bus. A special course was taken where students learned how to influence people and what is the difference between influencing and robbery.

The transport system is very special: all lines are unidirectional and connect exactly two stops. Buses leave the originating stop with passangers each half an hour. After reaching the destination stop they return empty to the originating stop, where they wait until the next full half an hour, e.g. X:00 or X:30, where 'X' denotes the hour. The fee for transport between two stops is given by special tables and is payable on the spot. The lines are planned in such a way, that each round trip (i.e. a journey starting and finishing at the same stop) passes through a Central Checkpoint Stop (CCS) where each passenger has to pass a thorough check including body scan.

All the ACM student members leave the CCS each morning. Each volunteer is to move to one predetermined stop to invite passengers. There are as many volunteers as stops. At the end of the day, all students travel back to CCS. You are to write a computer program that helps ACM to minimize the amount of money to pay every day for the transport of their employees.

Input

The input consists of N cases. The first line of the input contains only positive integer N. Then follow the cases. Each case begins with a line containing exactly two integers P and Q, 1 <= P,Q <= 1000000. P is the number of stops including CCS and Q the number of bus lines. Then there are Q lines, each describing one bus line. Each of the lines contains exactly three numbers - the originating stop, the destination stop and the price. The CCS is designated by number 1. Prices are positive integers the sum of which is smaller than 1000000000. You can also assume it is always possible to get from any stop to any other stop.

Output

For each case, print one line containing the minimum amount of money to be paid each day by ACM for the travel costs of its volunteers.

Sample Input

2
2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50

Sample Output

46
210 题意:意思很简单,给一个无向图,顶点1—n,求顶点1到其他所有顶点的来回费用最小,即求顶点1到其他顶点的最小费用以及其他所有顶点到顶点1的最小费用的和。
思路:这个题给的数据是100W,如果用邻接矩阵存可能会超内存,如果用Dij可能会超时,所以就用邻接表+SPFA,建图的时候要正逆向建图,正向建图求顶点1到其他顶点的最短路,逆向建图求其他顶点到顶点1的最短路,所以两次SPFA求以顶点1为源点的最短路径的和就是最小花费。
 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f;
typedef long long LL; struct edge
{
int to,w;
struct edge *next;
}; struct edge *map1[maxn],*map2[maxn];
int n,m;
LL ans;
LL dis[maxn];
int inque[maxn]; void SPFA(int flag)
{
queue<int>que;
while(!que.empty())
que.pop();
for(int i = ; i <= n; i++)
{
dis[i] = INF;
inque[i] = ;
} dis[] = ;
inque[] = ;
que.push();
while(!que.empty())
{
int u = que.front();
que.pop();
inque[u] = ; struct edge *tmp;
if(flag == )
tmp = map1[u];
else tmp = map2[u];
while(tmp)
{
int v = tmp->to;
int w = tmp->w;
if(dis[v] > dis[u]+w)
{
dis[v] = dis[u] + w;
if(!inque[v])
{
inque[v] = ;
que.push(v);
}
}
tmp = tmp->next;
}
}
for(int i = ; i <= n; i++)
ans += dis[i];
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int u,v,w;
struct edge *tmp1,*tmp2;
memset(map1,,sizeof(map1));
memset(map2,,sizeof(map2));
scanf("%d %d",&n,&m);
for(int i = ; i < m; i++)
{
scanf("%d %d %d",&u,&v,&w);
tmp1 = new edge;//为tmp1开辟空间;正向建图
tmp1->to = v;
tmp1->w = w;
tmp1->next = NULL;
if(map1[u] == NULL)
map1[u] = tmp1;
else
{
tmp1->next = map1[u];
map1[u] = tmp1;
} tmp2 = new edge;//为tmp2开辟空间;逆向建图
tmp2->to = u;
tmp2->w = w;
tmp2->next = NULL; if(map2[v] == NULL)
map2[v] = tmp2;
else
{
tmp2->next = map2[v];
map2[v] = tmp2;
}
}
/*for(int i = 1; i <= n; i++)//输出邻接表。
{
printf("%d: ",i);
tmp1 = map1[i];
while(tmp1)
{
printf("%d ",tmp1->to);
tmp1 = tmp1->next;
}
printf("\n");
}*/
ans = ;
SPFA();//正向寻找1顶点到其他所有顶点的最短距离
SPFA();//逆向寻找1顶点到其他所有顶点的最短距离
printf("%lld\n",ans);
}
return ;
}
 

Invitation Cards(邻接表+逆向建图+SPFA)的更多相关文章

  1. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  2. POJ 3687 Labeling Balls 逆向建图,拓扑排序

    题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...

  3. 无向图的 DFS 和 BFS实现 (以邻接表存储的图)

    #include <iostream> #include <queue> using namespace std; #define MaxVertexNum 10 typede ...

  4. hdu 4857 逃生 拓扑排序+逆向建图

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...

  5. POJ1122_FDNY to the Rescue!(逆向建图+最短路树)

    FDNY to the Rescue! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2368   Accepted: 72 ...

  6. POJ 1511 Invitation Cards 链式前向星+spfa+反向建边

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 27200   Accepted: 902 ...

  7. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...

  8. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...

  9. NOIP2013 华容道 (棋盘建图+spfa最短路)

    #include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...

随机推荐

  1. (转)ie浏览器判断

    常用的 JavaScript 检测浏览器为 IE 是哪个版本的代码,包括是否是最人极端厌恶的 ie6 识别与检测. var isIE=!!window.ActiveXObject; var isIE6 ...

  2. 31、三层架构、AJAX+FormsAuthentication实现登陆

    三层架构 前段时间公司要求修改一个网站,打开后我疯了,一层没有都是调用的DB接口,遍地的SQL语句,非常杂乱. 什么是三层架构? 三层架构是将整个项目划分为三个层次:表现层.业务逻辑层.数据访问层.目 ...

  3. 使用html5兼容低版本浏览器

    因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...

  4. 第三部分 关于HHibernate中关键字ID的配置

    实体类映射中,必须配置一个关键字,对应着数据表的关键字,大多数的实体类也都有一个属性表示类的唯一性,在实体类配置文件(.hbm.xml)中,<id>元素的就是这个作用. 一个完整的ID配置 ...

  5. VS2010无法打开CSS问题

    安装了VS2010的SP1补丁后,发现打开css文件时出现下面问题: 一点击css文件就弹出:未能完成操作.未指定的错误.无法正常进入. [解决方法]安装最新Web Standards Update补 ...

  6. Handler 原理分析和使用(一)

    我为什么写Handler,原因主要还在于它在整个 Android 应用层面非常之关键,他是线程间相互通信的主要手段.最为常用的是其他线程通过Handler向主线程发送消息,更新主线程UI. 下面是一个 ...

  7. 使用graphics2D给图片上画字符

    //读取图片BufferedImage frontImage = ImageIO.read(new File(eCardXMLConfigManager.geteCardXMLConfigManage ...

  8. maven依赖缺少oracle驱动包

    maven添加oracle jdbc驱动的依赖问题 在maven工程里不能下载oracle的jdbc驱动jar包,需要Oracle官方授权才可以,找一个ojdbc14的10.2.0.1.0或10.2. ...

  9. iOS,长按图片保存实现方法,轻松搞定!

    1.添加手势识别: UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@s ...

  10. SQL的数据类型

    Character 字符串: 数据类型 描述 存储 char(n) 固定长度的字符串.最多 8,000 个字符. N的范围1-8000 varchar(n) 可变长度的字符串.最多 8,000 个字符 ...