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 ...
随机推荐
- python with open as f 写韩文中文乱码
python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...
- Rails中文乱码问题【转】
乱码情况一:netbeas控制台输出乱码 具体表现为:在程序中定义中文字符串,然后输出.但输出为乱码 解决方法:打开netbeans安装目录,找到etc目录下的netbeans.conf文件.在net ...
- 线程安全(1)--demo1
成员变量的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的.想想在使用struts1时,不推荐创建成员变量,因为action是单例 ...
- 下拉列表---demo---bai
select.jsp <%@ page language="java" import="java.util.*" pageEncoding="U ...
- debian7 安装VMware Tools
前提:需要安装gcc.kernel 1. apt-get install gcc 2. apt-get install kernel 问题描述: 安装时如果提示更换介质 :请把标有 " de ...
- 将本地代码上传至github
注册github账号 https://github.com/ 安装git工具 https://git-for-windows.github.io 1.在github中创建一个项目 2.填写相应信息,点 ...
- python获得当前工作目录和修改
import os curDir = os.getcwd() 最近使用Python 写了很多脚本,想导入脚本,发现不知道如何查看python 的默认工作目录,并修改默认工作目录. 方法/步骤 查 ...
- 【WebRTC】简介
WebRTC 名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...
- oracle 常用set命令
SQL> set timing on; //设置显示“已用时间:XXXX”SQL> set autotrace on; //设置允许对执行的sql进行分析 ...
- sharepoint文档库中日期显示详细日期,不显示几天前
文档库---库设置----栏