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> # ...
随机推荐
- Mybatis中实现oracle的批量插入、更新
oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别
问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...
- Bootstarp--全局CSS样式之表格
表格在实际开发中可以说是非常常见的,但是有很多人不喜欢使用表格,但个人觉得在简单的界面布局中使用表格还是很简单的.毕竟人家给了表格这元素,而你却不去使用,貌似有点不解风情. 下面简单介绍Bootstr ...
- Context是什么,怎么用
一.Context是什么 开始学安卓的时候发现经常有context,但是都不知道为什么,什么时候需要它. 官方文档概述:关于应用程序环境的全局信息的接口.这是一个抽象类,它的实现是由安卓系统提供的.它 ...
- 容易被忽略的两个方法:onSaveInstanceState()和onRestoreInstanceState()
onSaveInstanceState()和onRestoreInstanceState()两个方法,在Activity中是比较容易忽视的方法,但是不得不说还是比较好用的方法,onSaveInstan ...
- 创建Java线程池
线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线 ...
- Oracle数据库学习 视图、序列及存储过程
视图(View) 视图也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示. 视图对应一个select语句,结果集被赋予一个名字,也就是视图的名字. 视图本身不包含任何数据,它只是包含映射到基表的一个查 ...
- IOS pop使用代理传值
假如oneViewController页面push到OtherViewController页面,然后你想从OtherViewController页面pop到oneViewController页面的时候 ...
- 【原创】Android 从一个Activity跳转到另外一个Activity
Android四大组件activity使用,实现两个activity之间的跳转 基本流程:创建两个activity-将其中一个activity中组件作为事件源-通过组件事件的处理借助intent对象实 ...
- php函数应用场景
截取文件后缀: $slen = strlen($suffix); substr($this->uri_string, -$slen) === $suffix 原理:截取倒数多少长度字符 判断多维 ...