2015安徽省赛 G.你来擒孟获
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.你来擒孟获的更多相关文章
- 2015安徽省赛 H.数7
http://xcacm.hfut.edu.cn/problem.php?id=1212 模拟大发 #include<iostream> #include<cstdio> #i ...
- 2015安徽省赛 I.梯田
http://xcacm.hfut.edu.cn/problem.php?id=1213 set + 搜索 姐姐是用搜索+二分做的,效率要高很多 #include<iostream> #i ...
- 2015安徽省赛 J.镜像树
http://xcacm.hfut.edu.cn/problem.php?id=1214 乱搞题 数组+结构体 递归遍历 #include<iostream> #include<cs ...
- 2015安徽省赛 F.多重部分和问题
题目描述 有n种不同大小的数字,每种各个.判断是否可以从这些数字之中选出若干使它们的和恰好为K. 输入 首先是一个正整数T(1<=T<=100) 接下来是T组数据 每组数据第一行是一个正整 ...
- 2015安徽省赛 D.锐雯上单不给就送
题目描述 <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配的战网平台,包 ...
- 2015安徽省赛 C.LU的困惑
题目描述 Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率.现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中( ...
- 2015安徽省赛 B.求和
题目描述 对于正整数n,k,我们定义这样一个函数f,它满足如下规律 现在给出n和k,你的任务就是要计算f(n,k)的值. 输入 首先是一个整数T,表示有T组数据 接下来每组数据是n和k(1<=n ...
- 2015安徽省赛 A.First Blood
题目描述 盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题: 老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大.盖伦很 ...
- 2016湖南省赛----G - Parenthesis (括号匹配)
2016湖南省赛----G - Parenthesis (括号匹配) Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...
随机推荐
- 总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别
<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...
- codevs 1536 海战
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 白银 Silver 题目描述 Description 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物, ...
- JavaScript中两种类型的全局对象/函数
这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScri ...
- Linux服务器高并发实践经历
作为一个师父离职早的野生程序员,业务方面还可以达到忽悠别人的水平,但上升到性能层面那就是硬伤. 真实天上掉馅饼,公司分配了一个测试性能的任务,真是感觉我的天空星星都亮了. 高并发主要限制因素:CPU. ...
- jquery富文本在线编辑器UEditor
UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. UEditor的功能非常强大,官方 ...
- Fiddler 使用备忘
快捷键 ctrl + f(session 查询,高亮) ctrl + x(清除所有 session) alt + q(定位到命令行,以下操作为命令行语句) help(查看帮助文档) select sc ...
- Matlab2015入门学习01
1. 两个命令: clear: 清除内存中变量的值(在workspace中可以看到) clc: 清除Command Window中的输出 2. 脚本编辑器: matlab脚本扩展名为*.m 在Comm ...
- Django 1.9 Post 时候出现 CSRF token missing or incorrect 错误
get 的时候没有问题,只有在post的时候出现出现这个错误 在方法中加入 @csrf_exempt
- react.js 生命周期componentDidUpdate的另类用法:防止页面过渡刷新
场景:数据新增成功之后,需要返回原来的查询表,这时候的查询,需要使用react的生命周期:componentDidUpdate componentDidUpdate() 这个生命周期的作用是当prop ...
- 文件操作之FileOpenPicker、FileSavePicker和FolderPicker
Win10的开发经常需要进行文件的操作,因此文件的选择对话框FileOpenPicker.文件保存对话框FileSavePicker以及文件夹选择对话框FolderPicker十分重要.这三者的操作也 ...