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 ...
随机推荐
- 环境变量PATH超长问题[转]
症状回放: 最近安装一个Delphi的控件,结果,在安装之后启动Delphi时出现了找不到相关文件的错误.一开始以为是Delphi内的Library路径没有添加,查看,一切正常.再次启动Delphi, ...
- March 22 2017 Week 12 Wednesday
Satisfaction doesn't come from the outside, but from the inside. 满足感并非来自外界,而是来自内心. Everything that e ...
- JVM文章学习
JVM 文章 Java虚拟机学习 - 体系结构 内存模型http://blog.csdn.net/java2000_wl/article/details/8009362 Java虚拟机学习 - 对象 ...
- 程序的优化(PHP)
有些小细节往往容易被人忽视.有时候常常说优化代码优化代码,但是实际操作的时候,最容易被忽视的如下所示: echo 比 print 快. 使用echo的多重参数代替字符串连接. 在执行for循环之前确定 ...
- win10 安装YII2
YII2下载地址:http://www.yiichina.com/download 高级版本和基本版本的区别是: 基础版只有一个只有一个web应用,高级版则生成前后台.建议使用高级版,方便 Yii2框 ...
- html基础用法(下)
设计表格: <html> <head> <title>表格</title> <meta charset="utf-8" /&g ...
- Configuration 中无法自动注入依赖于component的bean
出现问题时我这样使用依赖注入 @Configuration public class WebServiceConfig { @Autowired private IMessageWebService ...
- 替换html里面的\r\n及解决记事本中的每个段落只有一行的情形
1. 在用python爬取小说的时候, 发现在内容里每次换行都有\r\n(即回车, 换行)出现. 此时可以采用 s.replace('\\r\\n','') , 其中s为字符串类型. 2. 在爬取完 ...
- HTTP头部信息解释分析
HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Chars ...
- shiro笔记-"Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - ylw, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should ext
在学习shiro过程中遇到这个错误,在网上找了好久资料也没找到解决办法,大概都是说和传入的值有问题.于是我试着耐心看我自己的报错信息,最终找到了原因并解决.每个人的问题可能都会有差异,所以建议大家耐心 ...