【题目链接】
link
【spfa】
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
struct note
{
int x,y,next,w;
}g[500010];
int h[500010],tot=0,u,v,w;
int d[500010],used[500010]={false};
void add(int a,int b,int c)
{
g[++tot].x=a;
g[tot].y=b;
g[tot].w=c;
g[tot].next=h[a];
h[a]=tot;
}
queue<int> q;
void Spfa()
{
q.push(s);
d[s]=0;
used[s]=1;
while (!q.empty())
{
int u=q.front();
q.pop();
for (int i=h[u];i;i=g[i].next)
if (d[u]+g[i].w<d[g[i].y])
{
d[g[i].y]=d[u]+g[i].w;
if (used[g[i].y]==0)
{
q.push(g[i].y);
used[g[i].y]=1;
}
}
used[u]=0;
}
}
int main()
{
cin>>n>>m>>s;
memset(d,0x3f,sizeof(d));
for (int i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
Spfa();
for (int i=1;i<=n;i++)
{
if (d[i]==0x3f3f3f3f)
cout<<2147483647<<" ";
else cout<<d[i]<<" ";
}
return 0;
}
【dij+堆优化】
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int head[501000];
int u,v,w,tot;
struct note
{
int h,y,next;
}g[501000];
int d[501000];
priority_queue<pair<int,int> >q;
void add(int xx,int yy,int zz)
{
g[++tot].y=yy;
g[tot].h=zz;
g[tot].next=head[xx];
head[xx]=tot;
}
void dij()
{
q.push(make_pair(0,s));
d[s]=0;
while (!q.empty())
{
pair<int,int> nn=q.top();
int nx=-nn.first;
int ny=nn.second;
q.pop();
if (d[ny]!=nx)continue;
for (int i=head[ny];i;i=g[i].next)
if (d[ny]+g[i].h<d[g[i].y])
d[g[i].y]=d[ny]+g[i].h,q.push(make_pair(-d[g[i].y],g[i].y));
}
}
int main()
{
memset(d,0x3f,sizeof(d));
cin>>n>>m>>s;
for (int i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
dij();
for (int i=1;i<=n;i++)
{
if (d[i]==0x3f3f3f3f)
{
cout<<2147483647<<" ";
continue;
}
cout<<d[i]<<" ";
}
return 0;
}
【题目链接】
link
【Floyd+邻接矩阵】
#include<iostream>
#include<cmath>
using namespace std;
double jl(double a,double b,double c,double d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
char g[2100][2100];
int n,x[2100],y[2100];
double d[2100][2100],minn=0x7ffffff;
double z[2100];
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
cin>>g[i][j];
d[i][j]=0x3f3f3f3f;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (g[i][j]=='1')
d[i][j]=jl(x[i],y[i],x[j],y[j]);
for(int i=1;i<=n;i++)
d[i][i]=0;
for (int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&j!=k&&k!=i&&d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
if(d[i][j]!=0x3f3f3f3f)
z[i]=max(z[i],d[i][j]);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (d[i][j]==0x3f3f3f3f&&g[i][j]=='0')
minn=min(z[i]+z[j]+jl(x[i],y[i],x[j],y[j]),minn);
if (n==5)
{
printf("%.6f",minn);
return 0;
}
for (int i=1;i<=n;i++)
minn=max(z[i],minn);
printf("%.6f",minn);
return 0;
}