我写的Dijkstra,n3logn 的
TLE ON PRE 13 ,巨佬们康康还有救吗/dk
#include<bits/stdc++.h>
using namespace std;
const int N=505,INF=2147483647;
int dis[N],x[N],a[N][N],ans[N],head[N];
struct node{
int dis,to,next;
}Edge[N*N];
struct Pair{
int now,dis;
bool operator <(const Pair &x) const
{
return x.dis<dis;
}
};
bool vis[N];
int n,tot;
inline int read()
{
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c))
w|=c=='-',c=getchar();
while(isdigit(c))
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void add(int u,int v,int w)
{
Edge[++tot].to=v;
Edge[tot].dis=w;
Edge[tot].next=head[u];
head[u]=tot;
}
inline void Dijkstra(int s)
{
memset(vis,0,sizeof(vis));
priority_queue<Pair> q;
q.push((Pair){s,0});
for(register int i=1;i<=n;++i)
dis[i]=INF;dis[s]=0;
while(!q.empty())
{
int u=q.top().now;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(register int i=head[u];i;i=Edge[i].next)
{
int v=Edge[i].to,w=Edge[i].dis;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
q.push((Pair){v,dis[v]});
}
}
}
}
int main()
{
n=read();
for(register int i=1;i<=n;++i)
for(register int j=1;j<=n;++j)
a[i][j]=read();
for(register int i=1;i<=n;++i)
x[i]=read();
for(register int i=n;i;--i)
{
for(register int j=i+1;j<=n;++j)
add(x[i],x[j],a[x[i]][x[j]]),add(x[j],x[i],a[x[j]][x[i]]);
for(register int j=i;j<=n;++j)
{
Dijkstra(x[j]);
for(register int k=i;k<=n;++k)
if(j==k) continue;
else ans[i]+=dis[x[k]];
}
}
for(register int i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}