板子~~~
Floyd
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
f[i][j]=min(f[i][j],f[i][k]+a[k][j]);
}
Floyd求最小环
for(int k=1;k<=n;k++)
{
for(int i=1;i<k;i++)
for(int j=i+1;j<k;j++)
minn=min(minn,f[i][j]+a[i][k]+a[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
dijstra
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,s;
int fst[10005];
int nxt[500005];
int v[500005];
int k[500005];
int dis[50005];
int used[50005];
int edge;
const int inf=1000000000;
void add(int x,int y,int val)
{
edge++;
nxt[edge]=fst[x];
fst[x]=edge;
v[edge]=y;
k[edge]=val;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
int x,y,val;
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
}
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[s]=0;
for(int i=1;i<=n;i++)
{
int minn=inf;
int x;
for(int j=1;j<=n;j++)
{
if(!used[j]&&minn>dis[j])
{
minn=dis[j];
x=j;
}
}
used[x]=1;
//cout<<x<<endl;
for(int j=fst[x];j;j=nxt[j])
{
if(dis[x]+k[j]<dis[v[j]])
dis[v[j]]=dis[x]+k[j];//cout<<k[j]<<endl;
}
}
for(int i=1;i<=n;i++)
{
if(dis[i]==inf)printf("2147483647 ");
else printf("%d ",dis[i]);
}
return 0;
}
dijstra堆优化
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n,m,s;
int fst[10005];
int nxt[500005];
int v[500005];
int k[500005];
int used[10005];
int dis[10005];
struct node
{
int num,dist;
};
priority_queue<node>q;
bool operator <(const node &a,const node &b)
{
return a.dist>b.dist;
}
int edge;
const int inf=1000000000;
void add(int x,int y,int val)
{
edge++;
nxt[edge]=fst[x];
fst[x]=edge;
v[edge]=y;
k[edge]=val;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y,val;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
}
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[s]=0;
node xxc;
xxc.num=s;
xxc.dist=0;
q.push(xxc);
while(!q.empty())
{
node now=q.top();
q.pop();
int xx=now.num;
int dist=now.dist;
if(used[xx])continue;
used[xx]=1;
for(int i=fst[xx];i;i=nxt[i])
{
if(dis[v[i]]>dis[xx]+k[i])
{
dis[v[i]]=dis[xx]+k[i];
node cc;
cc.num=v[i];
cc.dist=dis[v[i]];
q.push(cc);
}
}
}
for(int i=1;i<=n;i++)
{
if(dis[i]==inf)printf("2147483647 ");
else printf("%d ",dis[i]);
}
return 0;
}
SPFA
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n,m,s;
int fst[10005];
int nxt[500005];
int v[500005];
int k[500005];
int dis[10005];
int b[10005];
queue<int> q;
const int inf=1000000000;
int edge;
void add(int x,int y,int val)
{
edge++;
nxt[edge]=fst[x];
fst[x]=edge;
v[edge]=y;
k[edge]=val;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y,val;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
}
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[s]=0;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
b[x]=0;
for(int i=fst[x];i;i=nxt[i])
{
if(dis[x]+k[i]<dis[v[i]])
{
dis[v[i]]=dis[x]+k[i];
if(!b[v[i]])
{
b[v[i]]=1;
q.push(v[i]);
}
}
}
}
for(int i=1;i<=n;i++)
{
if(dis[i]==inf)printf("2147483647 ");
else printf("%d ",dis[i]);
}
return 0;
}