最短路模板
2017-09-14 17:31
183 查看
周六周日tyvj上有模拟赛
顺便逃了周练【雾
复习了一下图论里的基本算法
仿佛第一次写最短路的手生
代码写的太少了…orz…
Dijkstra:
SPFA:
floyd:
顺手在luogu上交了dikstra和板子和堆优化
GG
90分
莫名其妙wa了第三个点
交了spfa wa了第三个点
一开始有向图当成了无向图【雾
#include<bits/stdc++.h>
#define maxn 100005
#define maxm 500005
#define P pair<int,int>
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
int n,m,s;
int to[maxm],nxt[maxm],wei[maxm];
int head[maxn],dis[maxn],total;
void add(int u,int v,int w){
++total;
to[total]=v;
wei[total]=w;
nxt[total]=head[u];
head[u]=total;
}
void dijkstra(int x){
memset(dis,0x7f,sizeof(dis));
dis[x]=0;
priority_queue<P,vector<P>,greater<P>> q;
q.push(make_pair(0,x));
while(!q.empty()){
int jd=q.top().second;
q.pop();
for(int e=head[jd];e;e=nxt[e]){
if(dis[jd]+wei[e]<dis[to[e]]){
dis[to[e]]=dis[jd]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
}
/*for(int ti=1;ti<=n;++ti){
int jd=-1;
for(int i=1;i<=n;++i){
if(!vis[i]&&(jd==-1||dis[i]<dis[jd])) jd=i;
vis[jd]=1;
for(int e=head[jd];e;e=nxt[e]){
if(dis[jd]+wei[e]<dis[to[e]]) dis[to[e]]=dis[jd]+wei[e];
}
}
}*/
}
int main(){
read(n),read(m),read(s);
for(int i=1;i<=m;++i){
int u,v,w;
read(u),read(v),read(w);
add(u,v,w);
//add(v,u,w);
}
dijkstra(s);
for(int i=1;i<=n;++i) cout<<dis[i]<<" ";cout<<endl;
return 0;
}
顺便逃了周练【雾
复习了一下图论里的基本算法
仿佛第一次写最短路的手生
代码写的太少了…orz…
Dijkstra:
#include<bits/stdc++.h> #define maxn 10001 #define maxm 300001 using namespace std; template <typename T> void read(T &x){ x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0'; x*=f; } int to[maxm],wei[maxm],nxt[maxm]; int head[maxn],dis[maxn],pre[maxn]; bool vis[maxn]; int n,m; int total; void add(int u,int v,int w){ ++total; to[total]=v; wei[total]=w; nxt[total]=head[u]; head[u]=total; } void dijkstra(int x){ memset(vis,0,sizeof(vis)); memset(dis,0x7f,sizeof(dis)); dis[x]=0; for(int i=1;i<=n;++i) pre[i]=i; for(int ti=1;ti<=n;++ti){ int jd=-1; for(int i=1;i<=n;++i) if(!vis[i]&&(jd==-1||dis[i]<dis[jd])) jd=i; vis[jd]=1;//超重要! for(int e=head[jd];e;e=nxt[e]){ if(!vis[to[e]]&&dis[jd]+wei[e]<dis[to[e]]){ dis[to[e]]=dis[jd]+wei[e]; pre[to[e]]=jd; } } } } void showpath(int x){ if(pre[x]==x) return; else{ showpath(pre[x]); cout<<pre[x]<<" "; } } int main(){ read(n),read(m); int u,v,w; for(int i=1;i<=m;++i){ read(u),read(v),read(w); add(u,v,w); add(v,u,w); } dijkstra(2); for(int i=1;i<=n;++i)cout<<dis[i]<<" "; cout<<endl; for(int i=1;i<=n;++i){ showpath(i); cout<<i<<endl; } return 0; }
SPFA:
#include<bits/stdc++.h> #define maxn 10001 #define maxm 300001 using namespace std; template <typename T> void read(T &x){ x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0'; x*=f; } int to[maxm],nxt[maxm],wei[maxm],total; int head[maxn],dis[maxn],Q[maxn]; bool vis[maxn]; int n,m; void add(int u,int v,int w){ ++total; to[total]=v; wei[total]=w; nxt[total]=head[u]; head[u]=total; } void spfa(int x){ int f=0,t=1; memset(Q,0,sizeof(Q)); memset(dis,0x7f,sizeof(dis)); memset(vis,0,sizeof(vis)); Q[1]=x; vis[x]=1; dis[x]=0; while(f<t){ f++; vis[Q[f]]=0; for(int e=head[Q[f]];e;e=nxt[e]){ if(dis[to[e]]>dis[Q[f]]+wei[e]){ dis[to[e]]=dis[Q[f]]+wei[e]; if(!vis[to[e]]){ ++t; Q[t]=to[e]; vis[to[e]]=1; } } } } } int main(){ read(n),read(m); for(int i=1;i<=m;++i){ int u,v,w; read(u),read(v),read(w); add(u,v,w); add(v,u,w); } spfa(1); for(int i=1;i<=n;++i) cout<<dis[i]<<" "; return 0; }
floyd:
for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
顺手在luogu上交了dikstra和板子和堆优化
GG
90分
莫名其妙wa了第三个点
交了spfa wa了第三个点
一开始有向图当成了无向图【雾
#include<bits/stdc++.h>
#define maxn 100005
#define maxm 500005
#define P pair<int,int>
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
int n,m,s;
int to[maxm],nxt[maxm],wei[maxm];
int head[maxn],dis[maxn],total;
void add(int u,int v,int w){
++total;
to[total]=v;
wei[total]=w;
nxt[total]=head[u];
head[u]=total;
}
void dijkstra(int x){
memset(dis,0x7f,sizeof(dis));
dis[x]=0;
priority_queue<P,vector<P>,greater<P>> q;
q.push(make_pair(0,x));
while(!q.empty()){
int jd=q.top().second;
q.pop();
for(int e=head[jd];e;e=nxt[e]){
if(dis[jd]+wei[e]<dis[to[e]]){
dis[to[e]]=dis[jd]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
}
/*for(int ti=1;ti<=n;++ti){
int jd=-1;
for(int i=1;i<=n;++i){
if(!vis[i]&&(jd==-1||dis[i]<dis[jd])) jd=i;
vis[jd]=1;
for(int e=head[jd];e;e=nxt[e]){
if(dis[jd]+wei[e]<dis[to[e]]) dis[to[e]]=dis[jd]+wei[e];
}
}
}*/
}
int main(){
read(n),read(m),read(s);
for(int i=1;i<=m;++i){
int u,v,w;
read(u),read(v),read(w);
add(u,v,w);
//add(v,u,w);
}
dijkstra(s);
for(int i=1;i<=n;++i) cout<<dis[i]<<" ";cout<<endl;
return 0;
}
相关文章推荐
- ACM_最短路模板(SPFA,Dijkstra,Floyd)
- K短路问题模板(spfa+A*)
- Dijkstra 模板 最短路
- POJ 3255 Roadblocks (次短路模板)
- POJ 2447 Remmarguts' Date【k短路 SPFA+A* 模板题】
- 最短路 kruskal模板
- uva 11374 最短路+记录路径 dijkstra最短路模板
- 最短路-dijkstra与floyd的邻接矩阵模板示例
- 最短路 【spfa】 模板
- 最短路模板(SPFA+dijkstra)
- 无向图最小生成树、次小生成树,最短路模板
- 最短路模板
- 模板整理——图论·最短路·dijkstra+堆
- caioj 1088 最短路模板
- 最短路--floyd算法模板
- 【单源最短路模板】 poj 2387
- 模板整理: 图论---最短路
- 最短路(floyed算法,模板题)
- POJ 1874 畅通工程续(最短路模板题)
- 最短路(floyd算法)模板