您的位置:首页 > 其它

最短路模板

2017-09-14 17:31 141 查看
周六周日tyvj上有模拟赛

顺便逃了周练【雾

复习了一下图论里的基本算法

仿佛第一次写最短路的手生

代码写的太少了…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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: