SPFA算法(2) POJ 1511 Invitation Cards
原题:
| Time Limit: 8000MS | Memory Limit: 262144K | |
| Total Submissions: 31230 | Accepted: 10366 |
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到除1以外所有的点,再从那些点回到1之后的费用(即路上权)的相加总和。
思路:从点1到其他点就是最典型的单源点最短路径问题,又因为最多会有1000000个点和1000000条边,因此采用SPFA无疑是最好的选择。然后考虑从其他点回到1点,这里只要将图中所有的边反向,然后再求一遍点1到其他点的费用和,最后相加两次的费用和即可。
注意点:因为点很多,所以不用邻接矩阵储存图,而用邻接表储存图。
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
int q,n,m;
int u1[],v1[],w1[],first1[],next1[];
int u2[],v2[],first2[],next2[];
int dis[],t[];
bool e[];
int temp;
int tmp;
int head,tail;
long long ans1,ans2;
int main(){
int i,j; scanf("%d",&q);
for(j=;j<=q;j++){
scanf("%d%d",&n,&m); for(i=;i<=n;i++){ //图的邻接表储存
first1[i]=-;
first2[i]=-;
}
for(i=;i<=m;i++){ //分别储存两种,一个是反向后的图
scanf("%d%d%d",&u1[i],&v1[i],&w1[i]);
next1[i]=first1[u1[i]];
first1[u1[i]]=i; v2[i]=u1[i];
u2[i]=v1[i]; next2[i]=first2[u2[i]];
first2[u2[i]]=i;
} for(i=;i<=n;i++) //SPFA初始化
dis[i]=0x7fffffff;
dis[]=;
memset(e,false,sizeof(e));
e[]=true;
t[]=;
head=;
tail=; while(head!=tail){
head=(head+)%; //头指针下移
temp=t[head]; //temp为队首元素,是一个点
e[temp]=false; //队列首个元素出队
tmp=first1[temp]; //tmp表示以temp为起点的并且在邻接表中的第一条边
while(tmp!=-){ //枚举与temp相连的点
if(dis[v1[tmp]]>dis[temp]+w1[tmp]){
dis[v1[tmp]]=dis[temp]+w1[tmp]; //修改
if(!e[v1[tmp]]){
e[v1[tmp]]=true; //新元素入列
tail=(tail+)%; //队尾指针下移
t[tail]=v1[tmp];
}
}
tmp=next1[tmp]; //找其他以temp为起点的边,在邻接表中找
} }
ans1=; //求和
for(i=;i<=n;i++)
ans1+=dis[i]; //下同 for(i=;i<=n;i++)
dis[i]=0x7fffffff;
for(i=;i<=;i++) //队列清空
t[i]=;
dis[]=;
memset(e,false,sizeof(e));
e[]=true;
t[]=;
head=;
tail=; while(head!=tail){
head=(head+)%;
temp=t[head];
e[temp]=false;
tmp=first2[temp];
while(tmp!=-){
if(dis[v2[tmp]]>dis[temp]+w1[tmp]){
dis[v2[tmp]]=dis[temp]+w1[tmp];
if(!e[v2[tmp]]){
tail=(tail+)%;
e[v2[tmp]]=true;
t[tail]=v2[tmp];
}
}
tmp=next2[tmp];
}
}
ans2=;
for(i=;i<=n;i++)
ans2+=dis[i];
printf("%lld\n",ans1+ans2); //输出答案
}
return ;
}
SPFA算法(2) POJ 1511 Invitation Cards的更多相关文章
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- POJ 1511 Invitation Cards (最短路spfa)
Invitation Cards 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description In the age ...
- Poj 1511 Invitation Cards(spfa)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...
- (简单) POJ 1511 Invitation Cards,SPFA。
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- POJ 1511 Invitation Cards 链式前向星+spfa+反向建边
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 27200 Accepted: 902 ...
- POJ 1511 Invitation Cards(逆向思维 SPFA)
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- [POJ] 1511 Invitation Cards
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 18198 Accepted: 596 ...
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
随机推荐
- vue-cli项目接口地址可配置化(多环境部署)一处修改多处适用
本文档目的在于帮助对vue了解比较少的同学,能够快速配置vue应用中的接口地址.方便项目切换服务环境后,重新修改多组件的http请求地址. 一.前言 我们在上一篇文章分享了vue-cli项目基本搭建( ...
- Sticky footers 套路
[CSS Secrets] http://shop.oreilly.com/product/0636920031123.do 以饿了么商家信息的弹出层为例,布局如下: <!-- 饿了么 弹出层部 ...
- dedecms 模板文件不存在 无法解析文档!问题定位方法!
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
- 遍历目录树 - Unicode 模式
=info 遍历目录树 支持 Unicode Code by 523066680@163.com 2017-03 V0.5 使用Win32API判断目录硬链接 ...
- Docker镜像提交命令commit的工作原理和使用方法
在本地创建一个容器后,可以依据这个容器创建本地镜像,并可把这个镜像推送到Docker hub中,以便在网络上下载使用. 下面我们来动手实践. docker pull nginx:1.15.3 用命令行 ...
- 第一次在stack overflow回答问题
越发感觉英语的重要性,尝试阅读英文与写作英文.于是选择了stack overflow来进行实践.作为萌新小白,只学习过C语言,就在c标签下乱逛.尝试看懂一些问题且试着回答. 发现一个问题: I nee ...
- linux shell中 if else以及大于、小于、等于逻辑表达式介绍
在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下, 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注 ...
- 线程概念的外延 Threading Terminology-What Are Threads
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/AboutThrea ...
- HDU 1045 Fire Net 【连通块的压缩 二分图匹配】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- [ZJOI2012]小蓝的好友
https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...