最近打算整理一下noip范围内的各种板子,就从最短路开始吧。
因为是给自己看的所以没加注释233
Dijkstra:
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int mxn =10003,mxm =500003,inf=0x7fffffff;
struct Edge{
int nx,to,val;
}e[mxm];
struct Node{
int d,u;
bool operator < (const Node &x) const{
return x.d<d;
}
};
int hd[mxn];
int vis[mxn];
int dis[mxn];
int n,m,s,ecnt;
inline void add_edge(int u,int v,int w)
{
e[++ecnt].nx=hd[u];
hd[u]=ecnt;
e[ecnt].to=v;
e[ecnt].val=w;
}
void Dijkstra(int s)
{
priority_queue<Node>q;
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0;
q.push((Node){0,s});
while(!q.empty())
{
Node x=q.top();q.pop();
int u=x.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=hd[u];i;i=e[i].nx)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
q.push((Node){dis[v],v});
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
}
Dijkstra(s);
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
printf("\n");
return 0;
}
SPFA:
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int mxn =10003,mxm =500003,inf=0x7fffffff;
struct Edge{
int nx,to,val;
}e[mxm];
int hd[mxn];
int inq[mxn];
int dis[mxn];
int n,m,s,ecnt;
inline void add_edge(int u,int v,int w)
{
e[++ecnt].nx=hd[u];
hd[u]=ecnt;
e[ecnt].to=v;
e[ecnt].val=w;
}
void spfa(int s)
{
queue<int>q;
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0;
q.push(s);
inq[s]=true;
while(!q.empty())
{
int u=q.front();q.pop();
inq[u]=false;
for(int i=hd[u];i;i=e[i].nx)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
if(!inq[v])
{
q.push(v);
inq[v]=true;
}
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
}
spfa(s);
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
printf("\n");
return 0;
}
Floyed:
#include <cstdio>
#include <algorithm>
using namespace std;
const int mxn =103,inf=0x7fffffff;
int g[mxn][mxn];
int n,m,s;
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=inf;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u][v]=min(g[u][v],w);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(g[i][k]!=inf&&g[k][j]!=inf)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(int i=1;i<=n;i++) g[i][i]=0;
for(int i=1;i<=n;i++) printf("%d ",g[s][i]);
printf("\n");
return 0;
}