最短路模板

来源:互联网 发布:华为加班 知乎 编辑:程序博客网 时间:2024/06/17 18:59

周六周日tyvj上有模拟赛

顺便逃了周练【雾

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

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

代码写的太少了…orz…


Dijkstra:

#include<bits/stdc++.h>#define maxn 10001#define maxm 300001using 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 300001using 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;}