#include <iostream>
#include <stdio.h>
#include <queue>
#include <algorithm>
#define MAXN 5000
#define INF 99999999
using namespace std;
struct point{
int x,y;
int step;
};
queue<point> Q;
int n,m,k,d;
int map[MAXN][MAXN];
int times[MAXN][MAXN];
int num[MAXN][MAXN];
int queue_m[MAXN*MAXN][2];
int queue_k[MAXN*MAXN][2];
bool flag[MAXN][MAXN];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int ax,ay;
void bfs(point s){
memset(flag,0,sizeof(flag));
int i;
Q.push(s);
point hd;
while(!Q.empty()){
hd=Q.front();
Q.pop();
for(i=0;i<4;i++){
int x=hd.x+dir[i][0];
int y=hd.y+dir[i][1];
if (x>=1 && x<=n && y>=1 && y<=n && map[x][y]!=3 && flag[x][y]==0){
point t;
t.x=x;
t.y=y;
t.step=hd.step+1;
if(map[t.x][t.y]==2){
if(t.step<times[t.x][t.y]){
times[t.x][t.y]=t.step;
}
}
Q.push(t);
flag[x][y]=1;
}
}
}
}
int main(){
int a,b,c;
while(scanf("%d%d%d%d",&n,&m,&k,&d)!=EOF){
memset(map,0,sizeof(map));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
times[i][j]=INF;
}
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
map[a][b]=1;
queue_m[i][0]=a;
queue_m[i][1]=b;
}
for(int i=0;i<k;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=2;
num[a][b]=c;
queue_k[i][0]=a;
queue_k[i][1]=b;
}
for(int i=0;i<d;i++){
scanf("%d%d",&a,&b);
map[a][b]=3;
}
for(int i=0;i<m;i++){
point start;
start.x=queue_m[i][0];
start.y=queue_m[i][1];
start.step=0;
bfs(start);
}
int sum=0;
for(int i=0;i<k;i++){
sum+=times[queue_k[i][0]][queue_k[i][1]]*num[queue_k[i][0]][queue_k[i][1]];
}
printf("%d\n",sum);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。