http://xcacm.hfut.edu.cn/problem.php?id=1211

SPFA模板题目

最短路变种,从起点终点各找一次最短路相加

#include<iostream>
#include<vector>
#include<deque>
#include<cstdio>
#include<cstring>
using namespace std;
struct Edge
{
int to,length;
};
bool spfa(const int &beg,const vector<vector<Edge>> &adjlist,vector<int> &dist,vector<int> &path)
{
const int &INF=0x7FFFFFFF,&NODE=adjlist.size();
dist.assign(NODE,INF);
path.assign(NODE,-);
deque<int> que(,beg);
vector<bool> flag(NODE,);
vector<int> cnt(NODE,);
dist[beg]=;
++cnt[beg];
flag[beg]=;
while(!que.empty())
{
const int now=que.front();
que.pop_front();
flag[now]=;
for(unsigned int i=; i!=adjlist[now].size(); ++i)
{
const int &next=adjlist[now][i].to;
if(dist[now]<INF&&
dist[next]>dist[now]+adjlist[now][i].length)
{
dist[next]=dist[now]+adjlist[now][i].length;
path[next]=now;
if(!flag[next])
{
if(++cnt[next]==NODE) return ;
if(que.empty()||
dist[next]<dist[que.front()])
que.push_front(next);
else que.push_back(next);
flag[next]=;
}
}
}
}
return ;
}
int main()
{
int n_num,e_num,beg,mid,T,end,donser[];;
scanf("%d",&T);
while(T--)
{
cin>>n_num>>e_num;
memset(donser,,sizeof(donser));
vector<vector<Edge> > adjlist(n_num,vector<Edge>());
for(int i=,p; i!=e_num; ++i)
{
Edge tmp;
cin>>p>>tmp.to>>tmp.length;
adjlist[p].push_back(tmp);
mid=p;
p=tmp.to;
tmp.to=mid;
adjlist[p].push_back(tmp);
}
cin>>beg>>end;
vector<int> dist,path;
spfa(end,adjlist,dist,path);
for(int j=;j<n_num;j++)
{
donser[j]=dist[j];
}
spfa(beg,adjlist,dist,path);
for(int j=;j<n_num;j++)
{
donser[j]+=dist[j];
}
mid=;
for(int i=;i<n_num;i++)
{
if(donser[i]>mid) mid=donser[i];
}
cout<<mid<<endl;
}
return ;
}

SPFA模板

/*
注:这是有向边,无向边自己加边
*/
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
struct Edge
{
int to,length;
};
bool spfa(const int &beg,//出发点
const vector<vector<Edge> > &adjlist,//邻接表,通过传引用避免拷贝
vector<int> &dist,//出发点到各点的最短路径长度
vector<int> &path)//路径上到达该点的前一个点
//C++习惯上函数异常返回非零值,未异常才返回0(想想main函数),因此出现负权回路返回1!
//福利:这个函数没有调用任何全局变量,可以直接复制!
{
const int &INF=0x7FFFFFFF,&NODE=adjlist.size();//用邻接表的大小传递顶点个数,减少参数传递
dist.assign(NODE,INF);//初始化距离为无穷大
path.assign(NODE,-);//初始化路径为未知
deque<int> que(,beg);//处理队列
vector<bool> flag(NODE,);//标志数组,判断是否在队列中
vector<int> cnt(NODE,);//记录各点入队次数,用于判断负权回路
dist[beg]=;//出发点到自身路径长度为0
++cnt[beg];//开始计数
flag[beg]=;//入队
while(!que.empty())
{
const int now=que.front();//当前处理的点,由于后面被删除,不可定义成常量引用
que.pop_front();
flag[now]=;//将该点拿出队列
for(int i=; i!=adjlist[now].size(); ++i)//遍历所有与当前点有路径的点
{
const int &next=adjlist[now][i].to;//目标点,不妨定义成常量引用,稍稍快些
if(dist[now]<INF&&//若距离已知(否则下面右式计算结果必爆int),且
//注:与运算先判断左式是否成立,若不成立则右式不会被判断
dist[next]>dist[now]+adjlist[now][i].length)//优于当前值
{
dist[next]=dist[now]+adjlist[now][i].length;//更新
path[next]=now;//记录路径
if(!flag[next])//若未在处理队列中
{
if(++cnt[next]==NODE)return ;//计数后出现负权回路
if(que.empty()||//空队列,或(或运算实现原理类似与运算)
dist[next]<dist[que.front()])//优先级高于队首(SLF)
que.push_front(next);//放在队首
else que.push_back(next);//否则放在队尾
flag[next]=;//入队
}
}
}
}
return ;
}
int main()
{
int n_num,e_num,beg,mid;//含义见下
cout<<"输入点数、边数、出发点:";
cin>>n_num>>e_num>>beg;
vector<vector<Edge> > adjlist(n_num,vector<Edge>());//默认初始化邻接表
for(int i=,p; i!=e_num; ++i)
{
Edge tmp;
cout<<"输入第"<<i+<<"条边的起点、终点、长度:";
cin>>p>>tmp.to>>tmp.length;
adjlist[p].push_back(tmp);
mid=p;
p=tmp.to;
tmp.to=mid;
adjlist[p].push_back(tmp);
}
vector<int> dist,path;//用于接收最短路径长度及路径各点
if(spfa(beg,adjlist,dist,path))cout<<"图中存在负权回路\n";
else for(int i=; i!=n_num; ++i)
{
cout<<beg<<"到"<<i<<"的最短距离为"<<dist[i]<<",反向打印路径:";
for(int w=i; path[w]>=; w=path[w])
cout<<w<<"<-";
cout<<beg<<'\n';
}
}

spfa模板

2015安徽省赛 G.你来擒孟获的更多相关文章

  1. 2015安徽省赛 H.数7

    http://xcacm.hfut.edu.cn/problem.php?id=1212 模拟大发 #include<iostream> #include<cstdio> #i ...

  2. 2015安徽省赛 I.梯田

    http://xcacm.hfut.edu.cn/problem.php?id=1213 set + 搜索 姐姐是用搜索+二分做的,效率要高很多 #include<iostream> #i ...

  3. 2015安徽省赛 J.镜像树

    http://xcacm.hfut.edu.cn/problem.php?id=1214 乱搞题 数组+结构体 递归遍历 #include<iostream> #include<cs ...

  4. 2015安徽省赛 F.多重部分和问题

    题目描述 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. 输入 首先是一个正整数T(1<=T<=100) 接下来是T组数据 每组数据第一行是一个正整 ...

  5. 2015安徽省赛 D.锐雯上单不给就送

    题目描述 <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配的战网平台,包 ...

  6. 2015安徽省赛 C.LU的困惑

    题目描述 Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率.现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中( ...

  7. 2015安徽省赛 B.求和

    题目描述 对于正整数n,k,我们定义这样一个函数f,它满足如下规律 现在给出n和k,你的任务就是要计算f(n,k)的值. 输入 首先是一个整数T,表示有T组数据 接下来每组数据是n和k(1<=n ...

  8. 2015安徽省赛 A.First Blood

    题目描述 盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题: 老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大.盖伦很 ...

  9. 2016湖南省赛----G - Parenthesis (括号匹配)

    2016湖南省赛----G - Parenthesis (括号匹配)   Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...

随机推荐

  1. Linux 脚本编写基础

    txt去重    http://man.linuxde.net/sort Linux 脚本编写基础 http://www.cnblogs.com/linn/archive/2007/03/05/664 ...

  2. jmeter(七)定时器

    知识来源有点复杂,其他测试工作者的博客,百度百科,搜集的电子文档,个人理解等等,限于水平和理解能力,可能有些内容有错误的地方... jmeter提供了很多元件,帮助我们更好的完成各种场景的性能测试,其 ...

  3. 物联网平台设计心得:DateTimePicker实现选择联动

    所谓的选择联动,就是指,当我DateTimePicker1选择2月4号的时候,我DateTimePicker2只能选择2月4号和2月5号两天,当然你可以自行规定要选择的日期.这在一些图表查询条件里面是 ...

  4. .NET跨平台之旅:将示例站点从ASP.NET 5 Beta7升级至RC1

    今天,我们将示例站点(about.cnblogs.com,服务器操作系统是Ubuntu)从ASP.NET 5 Beta7升级到了RC1,在升级过程中只遇到了一个问题. 在运行 dnvm upgrade ...

  5. 订餐系统之Excel批量导入

    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...

  6. Spring.Net 简单入门学习

    Spring.NET IoC容器的用法. 通过简单的例子学习Spring.Net 1.先创建一个控制台程序项目. 2.添加IUserInfoDal 接口. namespace Spring.Net { ...

  7. 第一篇puppet

    1,什么是puppet puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppe ...

  8. Delphi 实现数字转大写

    从网上找的一段代码 /// <summary> /// 小写转大写 /// </summary> /// <param name="mmje"> ...

  9. zend studio(Eclipse)和PyDev搭建Python开发环境

    原文是用Eclipse作开发环境,由于我已经装了zs,而zs也是基于Eclipse的,一试之下发现可以用,呵呵省事了.原文:http://www.cnblogs.com/Realh/archive/2 ...

  10. ztree.js的使用整理

    /** 配置:知识点管理 */ var setting = { view: { showIcon: false, addDiyDom: addPrevDom, addHoverDom: addHove ...