POJ1511 Invitation Cards SPFA算法裸题变形
原题目:http://poj.org/problem?id=1511
给出一个有向图,求出这个图从1到所有点的最短路径和所有点到1的最短路径的和。
这题数据量有点大,数据范围也大,所以用SPFA+邻接表做。
各种限制:Time Limit: 8000MS Memory Limit: 262144K(折腾评测机概念啊)
输入没什么处理的,注意在求所有点到1最短路径和的思想,嫑一看每个点都要是源点Floyd去了。。你想想,只要你把有向图所有箭头改一个方向,不又是从1到所有点的最短路径了么!?
废话不多说,贴代码!C++
这里我用了两个命名空间来防止重复,内容其实是一模一样的,(那我XX啊,直接一个类两个实例不就得了啊!不过这么写了就写了吧)用的STL的容器队列,SPFA,数组邻接表,会点SPFA都能看懂吧。好像是两秒多AC的,内存也不大。
因为数据范围太大,我们就用long long做的,不过为了省内存,我把不需要long long的地方都没有long long(我一同学除了_N用的int别的都用的long long,内存比我多)
//Accepted
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std; const int MAXN=1000000+10;
struct Edge
{
int v,w,next;
};
int m,n;
namespace sp1
{
Edge a[MAXN];
int link[MAXN];
bool visit[MAXN];
long long d[MAXN];
queue<int> q;
void memoryset()
{
memset(a,0,sizeof(a));
memset(link,0,sizeof(link));
memset(visit,0,sizeof(visit));
memset(d,0x3f,sizeof(d));
}
void add(int u,int v,int w)
{
static int tmp=1;
a[tmp].v=v;
a[tmp].w=w;
a[tmp].next=link[u];
link[u]=tmp;
tmp++;
}
void spfa()
{
q.push(1);
visit[1]=true;
d[1]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
visit[x]=false;
for(int i=link[x];i!=0;i=a[i].next)
{
if(d[x]+a[i].w<d[a[i].v])
{
d[a[i].v]=d[x]+a[i].w;
if(visit[a[i].v]==false)
{
q.push(a[i].v);
visit[a[i].v]=true;
}
}
}
}
}
};
namespace sp2
{
Edge a[MAXN];
int link[MAXN];
bool visit[MAXN];
long long d[MAXN];
queue<int> q;
void memoryset()
{
memset(a,0,sizeof(a));
memset(link,0,sizeof(link));
memset(visit,0,sizeof(visit));
memset(d,0x3f,sizeof(d));
}
void add(int u,int v,int w)
{
static int tmp=1;
a[tmp].v=v;
a[tmp].w=w;
a[tmp].next=link[u];
link[u]=tmp;
tmp++;
}
void spfa()
{
q.push(1);
visit[1]=true;
d[1]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
visit[x]=false;
for(int i=link[x];i!=0;i=a[i].next)
{
if(d[x]+a[i].w<d[a[i].v])
{
d[a[i].v]=d[x]+a[i].w;
if(visit[a[i].v]==false)
{
q.push(a[i].v);
visit[a[i].v]=true;
}
}
}
}
}
};
int main()
{
int _N;
scanf("%d",&_N);
while(_N--)
{ scanf("%d%d",&n,&m);
sp1::memoryset();
sp2::memoryset();
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
sp1::add(a,b,c);
sp2::add(b,a,c);
}
sp1::spfa();
sp2::spfa();
long long ans=0;
for(int i=1;i<=n;i++)
ans+=sp1::d[i];
for(int i=1;i<=n;i++)
ans+=sp2::d[i];
cout << ans << endl;
}
}
//以下是6月7号补充
我写了俩一模一样代码,注意是一模一样。。(猛的拍头)你不用一个类来封装啊!于是因为我懒就不写代码啦。。自己测了一下,一个SP的实例大小为25000296Bytes。。所以大家写的时候必须把SP的实例放全局,否则爆栈,否则爆栈,否则爆栈,否则爆栈,否则爆栈。。。
POJ1511 Invitation Cards SPFA算法裸题变形的更多相关文章
- poj1511/zoj2008 Invitation Cards(最短路模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Invitation Cards Time Limit: 5 Seconds ...
- POJ1511 Invitation Cards —— 最短路spfa
题目链接:http://poj.org/problem?id=1511 Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Tota ...
- POJ-1511 Invitation Cards( 最短路,spfa )
题目链接:http://poj.org/problem?id=1511 Description In the age of television, not many people attend the ...
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- hdu 1535 Invitation Cards(SPFA)
Invitation Cards Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other) T ...
- POJ-1511 Invitation Cards (双向单源最短路)
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: 24460 Accepted: 8091 De ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- POJ1511:Invitation Cards(最短路)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 34743 Accepted: 114 ...
随机推荐
- 实验吧CTF题库-安全杂项
XDCTF misc200: 题目提示: 下载文件 用foremost分离文件 接下来用archpr 4.53进行明文攻击 先把00002700.zip中的readme.txt提取出来压缩成zip文件 ...
- 2015.3.3 VC++6制作MFC dll并在其中使用对话框、引入类的操作
上例建立的dll为非MFC的,不能使用MFC框架,如CString.对话框等类型,使用起来有一定限制.可以建立MFC的Dll来改进.建立MFC Dll的方法: 1.在VC6中新建工程时选择:MFC A ...
- 部署和调优 2.2 squid反向代理
配置反向代理 打开配置文件 vim /etc/squid/squid.conf 修改 http_port 改为 http_port 80 accel vhost vport 在它下面添加一段 cach ...
- DAY13-前端之jQuery
jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行 ...
- adb device offline 解决办法
当电脑中的豌豆荚之类的应用打开的状态下 adb devices 显示连接状态 关闭手机助手之后,adb devices总显示 device offline 后来发现sdk platform-tool ...
- 无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_BIN" 之间的排序规则冲
在两个数据库之间进行复合查询时有时会出现如下错误: 无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_BIN&qu ...
- opencv3.2 编译安装说明
Create a temporary directory, which we denote as <cmake_binary_dir>, where you want to put the ...
- GCD 学习(二)dispatch_queue_create创建Dispatch Queue
摘录于: http://zhuyanfeng.com/archives/3042 dispatch_queue_create 用于创建用户线程队列.可以创建Serial/Concurrent Disp ...
- ZROI2018提高day4t3
传送门 分析 我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[ ...
- ZROI2018普转提day2t1
传送门 分析 我们通过仔细研究不难发现对于一次交换(i,i+1)的操作之后,在i之前的点就不可能跑到i之后,i+1之后的的点也不可能跑到i+1之前,所以这个序列在一次交换之后就相当于被分成了两个部分. ...