题目链接:https://csacademy.com/contest/arhiva/#task/force_graph/
大意是有若干个节点,每个节点对应一个二维坐标,节点之间相互有斥力存在。同时有些节点之间有变存在。对于有边存在的节点,他们互相的斥力大小为F1*dis值,否则则为F2*dis值,其中dis值为节点之间的欧氏距离。问每个节点受到的斥力大小。
这个其实就是很简单的数学推一下:先假设所有的点都受到F2*dis值,然后再加上所有有边的其他节点的斥力修正。
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <cstdio> 7 #include <math.h> 8 #include <queue> 9 #include <stack> 10 #include <map> 11 #include <cassert> 12 #include <set> 13 using namespace std; 14 15 16 const int N=323456; 17 18 19 struct Edge { 20 int to,next; 21 Edge() {} 22 Edge(int _to,int _next):to(_to),next(_next) {} 23 } edge[N<<2]; 24 int idx=1,head[N]; 25 inline void addedge(int u,int v) { 26 edge[++idx]=Edge(v,head[u]); 27 head[u]=idx; 28 } 29 30 long long x[N],y[N]; 31 int main () { 32 int n,m; 33 long long f1,f2; 34 while (scanf("%d %d %lld %lld",&n,&m,&f1,&f2)==4) { 35 idx=1;memset(head,0,sizeof head); 36 for (int i=1;i<=m;i++) { 37 int u,v; 38 scanf("%d %d",&u,&v); 39 addedge(u,v); 40 addedge(v,u); 41 } 42 long long sx=0,sy=0; 43 for (int i=1;i<=n;i++) { 44 scanf("%lld %lld",x+i,y+i); 45 sx+=x[i];sy+=y[i]; 46 } 47 for (int i=1;i<=n;i++) { 48 long long rx=(x[i]*n-sx)*f2; 49 long long ry=(y[i]*n-sy)*f2; 50 for (int k=head[i];k;k=edge[k].next) { 51 int j=edge[k].to; 52 long long dx=x[i]-x[j],dy=y[i]-y[j]; 53 rx+=dx*(f1-f2);ry+=dy*(f1-f2); 54 } 55 cout<<rx<<" "<<ry<<endl; 56 } 57 } 58 return 0; 59 }