求助
  • 板块灌水区
  • 楼主ll_dio
  • 当前回复10
  • 已保存回复13
  • 发布时间2024/8/20 16:24
  • 上次更新2024/8/20 18:41:38
查看原帖
求助
288476
ll_dio楼主2024/8/20 16:24
#include<bits/stdc++.h>
#define N 2001
#define V 13000*N+N
#define E 100001
#define INF 1e9
using namespace std;
int n,m,x[N],y[N],val[N],nV,nE,nEd,hd[V],h[V],dst[V],p[E];
bool ok[V];
struct Ed{
	int u,v,w;
} e[E+V];
struct Edge{
	int t,w,nxt;
} es[E+V]; 
struct Node{
	int val,u;
	bool operator<(const Node&a)const{
		return val>a.val;
	}
};
int ds(int u,int v){
	int t=(x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]);
	int st=sqrt(t);
	if(st==sqrt(t)) return st;
	else return st+1;
}
void add_edge(int u,int v,int w){
	es[++nE]=(Edge){v,w,hd[u]};
	hd[u]=nE;
}
void Bellman_Ford(){
	for(int i=1;i<nV;i++) h[i]=INF;
	h[nV]=0;
	for(int q=1;q<nV;q++)
		for(int i=1;i<=nEd;i++){
			if(h[e[i].u]==INF) continue;
			if(h[e[i].u]+e[i].w<h[e[i].v]) h[e[i].v]=h[e[i].u]+e[i].w;
		}
}
void Dijkstra(int S){
	for(int i=1;i<=nV;i++) dst[i]=INF,ok[i]=0;
	dst[S]=-val[S];
	priority_queue<Node> q;
	q.push((Node){0,S});
	while(!q.empty()){
		Node now=q.top(); q.pop();
		int u=now.u;
		if(ok[u]) continue;
		ok[u]=1;
		for(int i=hd[u],v,w;i;i=es[i].nxt){
			v=es[i].t; w=es[i].w;
			if(ok[v]) continue;
			int cost=dst[u]+w;
			if(cost>=dst[v]) continue;
			dst[v]=cost;
			q.push((Node){dst[v],v});
		}
	}
}
void input(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d %d %d",&x[i],&y[i],&val[i]);
	for(int i=1;i<=m;i++){
		int nP;
		scanf("%d",&nP);
		for(int j=1;j<=nP;j++) scanf("%d",&p[j]);
		e[++nEd]=(Ed){n*i+p[1],p[1],-val[p[1]]};
		for(int j=2;j<=nP;j++){
			e[++nEd]=(Ed){n*i+p[j-1],n*i+p[j],ds(p[j-1],p[j])};
			e[++nEd]=(Ed){p[j-1],n*i+p[j],ds(p[j-1],p[j])};
			e[++nEd]=(Ed){n*i+p[j],p[j],-val[p[j]]};
		}
	}
}
void solve(){
	nV=n*m+n+1;
	for(int i=1;i<nV;i++) e[++nEd]={nV,i,0};
	Bellman_Ford();
	for(int i=1;i<=nEd;i++)
		add_edge(e[i].u,e[i].v,e[i].w+h[e[i].u]-h[e[i].v]);
	for(int i=1;i<=n;i++){
		Dijkstra(i);
		for(int j=1;j<=n;j++) printf("%d ",-(dst[j]-h[i]+h[j]));
		printf("\n");
	}
}
int main(){
	freopen("metro.in","r",stdin);
	freopen("metro.out","w",stdout);
	input();
	solve();
	return 0;
}

这段代码本地运行没有问题,放到别的OJ上显示全部RTE,信息时Segmentation fault,有没有大佬来看看怎么回事

2024/8/20 16:24
加载中...