#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,有没有大佬来看看怎么回事