spfa算法JDOJ2208短 题解
来源:互联网 发布:基础网络知识 编辑:程序博客网 时间:2024/05/17 02:57
2208: 短
题目描述
给出无向图G=(V,E),求点V1和点VN之间的最短路。
输入
第一行两个整数|V|和|E|。
2~E+1行,每行3个整数Xi,Yi,Wi,表示点Vxi和点Vyi之间存在权值为Wi的边。
输出
一个整数表示最短路的权值。
样例输入
1 2 1
2 3 1
3 1 1
样例输出
提示
对于50%的数据,V<=103。
对于100%的数据,V<=105,E<=106,1<=Wi<=2。
此题V<=10^5,E<=10^6,所以有Dij堆优化和spfa两种算法.
今天我写一个spfa算法
#include<stdio.h>
#include<string.h>
int idx;
struct Edge
{
int val,to,next;
};
Edge edge[2000001];//edge[i].val表示边权是多少,edge[i].to表示到达谁,edge[i].next表示下一个是谁.存双向边数组要开2倍
int head[2000001];
int f[1000001];
int queue[4000001];
bool used[1000001];
void addedge(int a,int b,int c)//链表存边
{
edge[++idx].next=head[a];
head[a]=idx;
edge[idx].to=b;
edge[idx].val=c;
}
int main()
{
int n,e,i,j,a,b,c;
scanf("%d%d",&n,&e);
for(i=1;i<=e;i++)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);//调用函数
}
int front=0,tail=0;
queue[tail++]=1;
memset(f,1,sizeof(f));
f[1]=0;
memset(used,0,sizeof(used));
used[1]=1;
while(front<tail)//spfa核心,used[i]表示是否进入队列
{
int idx2=queue[front++];
used[idx2]=0;
for(j=head[idx2];j;j=edge[j].next)
{
if(f[edge[j].to]>f[idx2]+edge[j].val)
{
f[edge[j].to]=f[idx2]+edge[j].val;
if(used[edge[j].to]==0)
{
queue[tail++]=edge[j].to;
used[edge[j].to]=1;
}
}
}
}
printf("%d",f[n]);
}
- spfa算法JDOJ2208短 题解
- 最短路径算法---SPFA
- 最短路径----SPFA算法
- 【最短路径】SPFA算法
- SPFA算法【最短路径】
- 最短路径SPFA算法
- 最短路径算法之SPFA算法
- POJ_2394_最短路径---SPFA算法
- 最短路径之SPFA算法
- 最短路径 之 SPFA算法
- 最短路径的SPFA算法
- 【转载】最短路径之SPFA算法
- 最短路径问题 SPFA算法
- 最短路径 之 SPFA算法
- 最短路径——SPFA算法
- 最短路径之spfa算法
- 最短路径之Spfa算法
- 最短路径 之 SPFA算法
- linux初学者-网络桥接篇
- discuzX3.2 URL静态化处理
- Python入门(四)函数语法
- RabbitMQ java client Hello world程序
- Angular自定义指令之scope属性详解及实例演示
- spfa算法JDOJ2208短 题解
- [笔记]牛顿方法·指数族·GLMs
- 解决android.widget.LinearLayout cannot be cast to android.widget.ListView问题
- 算法——字符串匹配之朴素匹配算法
- 获取指定文件目录路径下的所有文件
- 嵌套循环与循环控制
- Segments POJ
- Cygwin 相关资源汇总
- URL中#(井号)的作用