Invitation Cards(邻接表+逆向建图+SPFA)
| Time Limit: 8000MS | Memory Limit: 262144K | |
| Total Submissions: 17538 | Accepted: 5721 |
Description
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
Output
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)的更多相关文章
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- POJ 3687 Labeling Balls 逆向建图,拓扑排序
题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...
- 无向图的 DFS 和 BFS实现 (以邻接表存储的图)
#include <iostream> #include <queue> using namespace std; #define MaxVertexNum 10 typede ...
- hdu 4857 逃生 拓扑排序+逆向建图
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...
- POJ1122_FDNY to the Rescue!(逆向建图+最短路树)
FDNY to the Rescue! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2368 Accepted: 72 ...
- POJ 1511 Invitation Cards 链式前向星+spfa+反向建边
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 27200 Accepted: 902 ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...
- NOIP2013 华容道 (棋盘建图+spfa最短路)
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...
随机推荐
- JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息
今天项目中所解决的问题:JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息,一开始总是获取不到 radio 的值,后来发现逻辑存在些问题,特此共享该代码留笔记 和 分享给遇到 这类问题的 ...
- shell脚本学习之Bash shell 里各种括号的用法
今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...
- OC相关-02:oc和c的基本差异
前言: 面向过程和面向对象. 简单的说,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不 ...
- jquery fancybox ie6无法显示关闭按钮
解决办法: 打开jquery.fancybox-1.3.4.css 注释掉这行就行了: .fancybox-ie6 #fancybox-close { background: transparent; ...
- Node.js(window)基础(2)——node环境下的模块,模块间调用
参考:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450241959 ...
- [Linux]XAMPP安装
XAMPP安装下载地址:http://xiazai.zol.com.cn/index.php?c=Detail_DetailMini&n=19e18f86d0596b5cd&softi ...
- TCP/IP笔记 应用层(3)——HTTP
1. URL URL(Uniform Resource Locator) 相当于一个文件名在网络范围的扩展. 1.1 格式 schema://host[:port#]/path/.../[?query ...
- python【第十四篇】HTML与CSS初遇
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...
- mac os x 10.9.1 安装 Homebrew软件包管理工具及brew安装maven3.1.1
Mac OSX上的软件包管理工具,安装软件或者卸载软件. 打开终端输入(如不行,可参考homebrew官网): ruby -e "$(curl -fsSL https://raw.githu ...
- namenode启动参数
namenode启动参数:-Xmx153600m -Xms153600m -Xmn4096m -verbose:gc -Xloggc:$LOG_DIR/namenode.gc.log -XX:Erro ...