floed
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,s,w,x,y;
long long a[2000][2000];
const long long INF=2147483647;
int main() {
long long i,j,k;
cin>>n>>m>>s;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=INF;
for(i=1;i<=m;i++) {
cin>>x>>y>>w;
a[x][y]=min(a[x][y],w);
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
a[s][s]=0;
for(i=1;i<=n;i++)
cout<<a[s][i]<<" ";
}
斯特拉
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=2147483647;
int dis[1000000],f[1000000],head[1000000];
int m,n,s,cnt;
struct deliver{
int to;
int nexty;
int w;
}edge[1000000];
void add(int x,int y,int z) {
cnt++;
edge[cnt].to=y;
edge[cnt].nexty=head[x];
edge[cnt].w=z;
head[x]=cnt;
}
void dijkstral() {
int i,j;
dis[s]=0;
for(i=1;i<=n;i++) {
int start=-1;
int minn=9999999;
for(j=1;j<=n;j++)
if(f[j]==0&&dis[j]<minn) {
minn=dis[j];
start=j;
}
f[start]=1;
for(j=head[start];j;j=edge[j].nexty)
dis[edge[j].to]=min(dis[edge[j].to],dis[start]+edge[j].w);
}
}
int main() {
int i,j,x,y,z;
cin>>n>>m>>s;
for(i=1;i<=n;i++)
dis[i]=maxx;
for(i=1;i<=m;i++) {
cin>>x>>y>>z;
add(x,y,z);
}
dijkstral();
for(i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
斯特拉堆优化
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define MP make_pair
#define fi first
#define se second
using namespace std;
const int maxn = 1e5+5;
const int maxm = 2e5+5;
typedef pair<int,int> pll;
struct edge{
int node,next,data;
}e[maxm];
int head[maxn],tot,n,m,s,dis[maxn];
priority_queue<pll,vector<pll>,greater<pll> >q;
void add(int x,int y,int z)
{
e[++tot].node=y; e[tot].next=head[x];
e[tot].data=z; head[x]=tot;
}
int read()
{
int ans=0,w=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-')
c=getchar();
if(c=='-')
{
w=-1; c=getchar();
}
while(c>='0'&&c<='9')
{
ans=ans*10+c-'0';
c=getchar();
}
return ans*w;
}
void dijstl(int s)
{
memset(dis,0x7f,sizeof(dis));
dis[s]=0; q.push(MP(dis[s],s));
while(!q.empty())
{
int u=q.top().se;
if(q.top().fi!=dis[u])
{
q.pop() ; continue;
}
q.pop() ;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].node;
if(dis[v]>dis[u]+e[i].data)
{
dis[v]=dis[u]+e[i].data;
q.push(MP(dis[v],v));
}
}
}
}
int main()
{
// scanf("%d%d%d",&n,&m,&s);
n=read(); m=read(); s=read();
int x,y,z;
for(int i=1;i<=m;i++)
{
// scanf("%d%d%d",&x,&y,&z);
x=read(); y=read(); z=read();
add(x,y,z); //add(y,x,z);
}
dijstl(s);
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
printf("\n");
return 0;
}
https://blog.youkuaiyun.com/c20182030/article/details/70757660
spfa
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=214748364;
int n,p,c,cnt,f[10000],head[10000],dis[100000],qu[100000],pp[100000],ans=inf;
struct de{
int to;
int nty;
int w;
}eg[10000];
void add(int a,int b,int d) {
cnt++;
eg[cnt].to=b;
eg[cnt].w=d;
eg[cnt].nty=head[a];
head[a]=cnt;
}
void spfa(int s) {
int i,j;
memset(f,0,sizeof(f));
for(i=1;i<=p;i++)
dis[i]=inf;
dis[s]=0;
f[s]=1;
int h=1,t=1;
qu[h]=s;
while(h<=t) {
int font=qu[h];
h++;
f[font]=0;
for(i=head[font];i;i=eg[i].nty)
if(dis[eg[i].to]>dis[font]+eg[i].w){
dis[eg[i].to]=dis[font]+eg[i].w;
if(f[eg[i].to]==0) {
t++;
qu[t]=eg[i].to;
f[eg[i].to]=1;
}
}
}
}
int main() {
int i,j,a,b,d;
cin>>n>>p>>c;
for(i=1;i<=n;i++)
cin>>pp[i];
for(i=1;i<=c;i++) {
cin>>a>>b>>d;
add(a,b,d);
add(b,a,d);
}
for(i=1;i<=p;i++) {
spfa(i);
int sum=0;
for(j=1;j<=n;j++)
sum+=dis[pp[j]];
ans=min(ans,sum);
}
cout<<ans;
return 0;
}