图论最短路——spfa
今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++。所以呢来篇博客记录一下。
香甜的黄油,当年做的时候吃了不少苦头现在完全会打了,下面是当时我的代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#include<iostream>
#include<string>
using namespace std;
const int maxn=,inf=;
int n,p,c,a,b,d,t,dist[maxn],s1[maxn],inq[maxn];
vector<int>g[maxn],w[maxn]; void spfa(int s)
{
queue<int>a;//一个队列a
for(int i=;i<=p;i++)//循环4个牧场都附极大值
dist[i]=inf;
memset(inq,,sizeof(inq));//清空inp dist[s]=;//把到当前的牧场距离设为0,毕竟是自己到自己
a.push(s);//进队
inq[s]=;//使其为1 while(!a.empty())//如果队列不为空
{
int i=a.front();//返回队首元素
a.pop();//弹出队首
inq[i]=;//使其为0
for(int k=;k<g[i].size();k++)//当前的牧场和其余的牧场相连
{
int j=g[i][k];//取i到j的牧场号询问其距离
if(dist[i]+w[i][k]<dist[j])//如果当前距离和i到k的距离小于j松弛操作
{
dist[j]=dist[i]+w[i][k];//松弛
if(inq[j]!=) continue;//询问是否在队列之中
inq[j]=;//不在的话再次标记
a.push(j);//使当前的点进队好像bfs但不是bfs多次进队
}
}
}
} int main()
{
//freopen("1.in","r",stdin);
scanf("%d%d%d",&n,&p,&c);//n为奶牛所在的牧场号,p为4个牧场,c为5个牧场的关系
memset(s1,,sizeof(s1));//s1存的是奶牛的牧场位置;
for(int i=;i<=n;i++)
{
scanf("%d",&t);//牛
s1[t]++;//牧场
}
for(int i=;i<=c;i++)
{
scanf("%d%d%d",&a,&b,&d);//a与b之间的距离为d
g[a].push_back(b);//扩边
g[b].push_back(a);
w[a].push_back(d);//二次扩边
w[b].push_back(d);
}
int ans=inf;//附最大值
for(int i=;i<=p;i++)//枚举每一个牧场为起点
{
spfa(i);//当黄油放在第i个牧场时来一个一个判断;跑距离
int sum=;
for(int j=;j<=p;j++)
{
if(!s1[j]) continue;
sum+=dist[j]*s1[j]; //计算奶牛到牧场的距离和
}
ans=min(sum,ans); //取最小值
}
printf("%d",ans);
return ;
}
注释很多很多,主要因为当时的不理解。
下面是本人今天的代码!!!
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<map>
#define inf 10000000
using namespace std;
const int maxn=;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int b[maxn],ver[maxn],lin[maxn],nex[maxn],len=,e[maxn],minn=inf,dis[maxn],q[maxn];
bool vis[maxn];
void add(int x,int y,int z)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
e[len]=z;
}
int n,m,k,h,t;
void spfa(int x)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(q,,sizeof(q));
dis[x]=;vis[x]=;q[]=x;
h=,t=;
while(h<=t)
{
int tn=q[++h];vis[tn]=;
for(int i=lin[tn];i;i=nex[i])
{
int tmp=ver[i];
if(dis[tn]+e[i]<dis[tmp])
{
dis[tmp]=dis[tn]+e[i];
if(vis[tmp]!=)
{
q[++t]=tmp;
vis[tmp]=;
}
}
}
}
}
int main()
{
freopen("1.in","r",stdin);
k=read();m=read();n=read();
memset(b,,sizeof(b));
for(int i=;i<=k;i++){int x;x=read();b[x]++;}
for(int i=;i<=n;i++)
{
int x,y,z;
x=read();y=read();z=read();
add(x,y,z);
add(y,x,z);
}
for(int i=;i<=m;i++)
{
int ans=;
spfa(i);
for(int j=;j<=m;j++)
{
if(b[j]!=)
ans+=dis[j]*b[j];
}
minn=min(ans,minn);
}
printf("%d\n",minn);
return ;
}
思路很清晰的打完了哈哈。
莫听穿林打叶声,何妨吟啸且徐行。
图论最短路——spfa的更多相关文章
- 图论--最短路--SPFA
SPFA算法(shortest path faster algorithm)算法是西南交通大学段凡丁于1994年发表的,它在Bellman-ford算法的基础上进行了改进,使其在能够处理待负权图的单元 ...
- 图论--最短路--SPFA模板(能过题,真没错的模板)
[ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
- 图论:最短路-SPFA
该算法由Bellman-Ford算法演变过来,首先介绍一下Bellman-Ford算法 最短路最多经过n-1个点,可以用n-1轮松弛操作来得到 ;i<n;i++) d[i]=INF; d[]=; ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 图论——最短路:Floyd,Dijkstra,Bellman-Ford,SPFA算法及最小环问题
一.Floyd算法 用于计算任意两个节点之间的最短路径. 参考了five20的博客 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个 ...
- 图论算法(三) 最短路SPFA算法
我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...
- 图论(最短路&最小生成树)
图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...
随机推荐
- MySQL 安装与配置
Linux 安装 MySQL Windows 安装 MySQL 如何连接 MySQL 如何修改 MySQL 密码 如何重置 MySQL 密码
- Android分包原理
如果App引用的库太多,方法数超过65536后无法编译.这是因为单个dex里面不能有超过65536个方法.为什么有最大的限制呢,因为Android会把每一个类的方法id检索起来,存在一个链表结构里面. ...
- es 批量导入文件
首先是json格式的文件: curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json 1 ...
- es5.0 安装ik中文分词器 mac
es5.0集成ik中文分词器,网上资料很多,但是讲的有点乱,有的方法甚至不能正常运行此插件 特别注意的而是,es的版本一定要和ik插件的版本相对应: 1,下载ik 插件: https://github ...
- fastcgi协议之一:定义
参考 深入理解fastcgi协议以及在php中的实现 https://mengkang.net/668.html fastcgi协议规范内容 http://andylin02.iteye.com/bl ...
- 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
本文转载至 http://www.cnblogs.com/ios122/p/4832859.html Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layou ...
- 用Copy命令合并文件
用Copy命令合并文件 这个文章是在我以前的百度空间里面发表过的,后来因为某个内分泌失调的管理员把我的空间http://hi.baidu.com/kamdy 封了! 旧事不提,还是回到主题吧,这个 ...
- 使用__FILE__和__LINE__定位错误
#include <stdio.h> int main() { printf("this fake error is in %s on line %d\n", __FI ...
- delphixe10 android操作 打电话,摄像头,定位等
XE6 不支持JStringToString.StringTojString.StrToJURI:use Androidapi.Helpers //Splash Image Delphi XE5,XE ...
- 【Spring Boot&& Spring Cloud系列】单点登录SSO概述
概念 单点登录(Singleton Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统. 也就 ...