ACM 188. [USACO Oct08] 被破坏的电力系统(缩点+SPFA)

2019-04-14 21:05发布

188. [USACO Oct08] 被破坏的电力系统

★☆   输入文件:pwrfail.in   输出文件:pwrfail.out   简单对比
时间限制:3 s   内存限制:128 MB 一场邪恶的暴风雨毁坏了农夫约翰的输电网中的一些电线!农夫约翰有一张包含了所有n(2<=n<=1000)个电能中转点的地图,这些 点被很自然而方便的标识为1..n,并且被整数坐标x_i,y_i(-100000<=x_i<=100000;-100000& lt;=y_i<=100000)定位于坐标系。 有w(1<=w<=10000)条电线仍然保存着没被暴风雨破坏,每条电线连接着两个电能中转点pi,pj(1<=pi<=n;1<=pj<=n)。 他希望从第一个电能中转点把电导入第n个(可能通过一些中间的电能中转点,应当有一组电线连接1和n)。 给出n个电能中转点的坐标和幸存的电线,请确定最少需要架设的电线总长度,但请注意,架设过程中,对于单条电线而言,其长度不应超过m(0.0<=m<=200000.0) 给出一个例子,在下面,左边是一个包含9个电能中转电和3条幸存电线的地图。在这个任务中,规定名。m=2.0。最佳的架设方案是连接6和4,以及6和9。 After the storm Optimally reconnected 3 . . . 7 9 . . . . . 3 . . . 7 9 . . . . . / 2 . . 5 6 . . . . . . 2 . . 5 6 . . . . . . / 1 2-3-4 . 8 . . . . . 1 2-3-4 . 8 . . . . . | | 0 1 . . . . . . . . . 0 1 . . . . . . . . . 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 这是的总长度是 1.414213562 + 1.414213562 = 2.828427124 . 分数:350 题目名称:pwrfail 输入格式:
  • 第一行:两个用空格隔开的整数 n和w
  • 第二行:一个实数:m
  • 第3..n+2:每一行包含两个用空格隔开的整数:x_i和y_i
  • 第n+3..n+2+w行:两个空格隔开的整数:pi和pj
输入样例(file pwrfail): 9 3 2.0 0 0 0 1 1 1 2 1 2 2 3 2 3 3 4 1 4 3 1 2 2 3 3 4 输入说明: 就像图表中说的那样。 输出格式: 第一行:一个整数,实际结果乘以1000后取整。请不要进行任何的4舍5入工作。 输出样例(file pwrfail.out): 2828 注意计算距离时数据会溢出使用long long然后缩点后SPFA
#include #include #include #include using namespace std; #define INF 999999999.0 #define MAX_N 1010 #define DIS(a,b) sqrt((pos[a].x-pos[b].x)*(long long)(pos[a].x-pos[b].x)+(pos[a].y-pos[b].y)*(long long)(pos[a].y-pos[b].y)) struct POS { int x,y; } pos[MAX_N]; struct FLAG { int V[MAX_N]; int cnt; } Flag[MAX_N]; int n,w; double m; bool road[MAX_N][MAX_N]; double dis[MAX_N][MAX_N]; double d[MAX_N][MAX_N]; double sd[MAX_N]; bool vis[MAX_N]; int sID,tID; void dfs(int v,int flagID) { if(v==0) sID=flagID; else if(v==n-1) tID=flagID; vis[v]=true; Flag[flagID].V[Flag[flagID].cnt++]=v; for(int i=0;isd[q]+d[q][u]) { sd[u]=sd[q]+d[q][u]; if(inq[u]) continue; queue[rear]=u; ADD(rear); inq[u]=true; } } } return sd[tID]; } int main() { freopen("pwrfail.in","r",stdin); freopen("pwrfail.out","w",stdout); scanf("%d%d",&n,&w); scanf("%lf",&m); for(int i=0;i