这个题是只能用Floyd做吗
查看原帖
这个题是只能用Floyd做吗
199459
Masna_Kimoyo楼主2021/9/29 21:45

我写的Dijkstra,n3lognn^3logn

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;
}
2021/9/29 21:45
加载中...