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 ...
随机推荐
- system中有空格怎么办
原始路径: C:\\Program Files\\putty\\putty.exe 改为: char *cmd="C:\\\"Program Files\"\\putty ...
- java线程面试题及答案
1)2017Java面试题及答案:什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务 ...
- 问题:C#Chart控件自动添加Series;结果:图形组件Chart动态添加Series
Chart1.DataSource = dtb; string[] strcolor = new string[20]; strcolor[0] = "220, 224, 64, 10&qu ...
- chromium浏览器开发系列第二篇:如何编译最新chromium
说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1. ...
- 【264】◀▶ Windows 批处理(CMD)
参考:Windows Commands 微软官方帮助 参考:DOS命令自学小窍门:巧用help命令 参考:bat批处理的注释语句 打开文件夹: start D:\abc 打开D盘abc文件夹 打开ex ...
- 使用百度地图SDK 这是之前版本 现在的sdk v2-1-2使用方法完全改变
1.添加BMapApiDemoApp.java 2.AndroidManifest文件 application里添加 android:name=".ui.BMapApiDemoApp&q ...
- JavaScript的运算符
一.什么是表达式??? 是ECMScript中的一个短语,解释器可以通过计算把它转成一个值,最简单的表达式是字面量或者变量名,单一字面量和组合字面量统称为表达式. 二.一元运算符 1.delete 运 ...
- phonegap创建项目
cordova create LynApp com.LynApp "LynApp"cd LynAppcordova platform add androidcordova buil ...
- 【总结整理】js获取css的属性(内部,外部,内嵌(写在tag中))
在JS中需要获取某个元素的宽高或者是绝对定位的位置信息,通常我们会这么写: var elemWidth = elem.style.width; console.log(elemWidth); //(空 ...
- IOS UITableView分组与索引分区实例
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...