poj pku 3013 图论 高效最短路
(2010-07-21 12:26:45)
标签:
pojpku3013it |
分类: 图论 |
题目描述:给你一些点和边,都有权值。这里,边的权值叫做权值1.
第一个点是树根。
当用一部分给定的边构成一棵树时,每条边的实际权值(权值2)等于(它所连的所有子节点的权值和 * 这条边开始给定的权值)
问构成一棵树的最小的 权值2 是多少。
解题报告:
自己随便建一棵树,把求解的式子列出来,就很容易发现:
从根节点到其他节点i的消耗是:经过边的权值1的和 * i节点的权值。
那么。就转化成了:按照权值1建图,求根节点到其他节点的最短路,每条最短路再乘以那个点的权值,最后求和就是答案。
问题在于:点和边都可能有50000之多,n^2算法肯定不行,因此可用的是:
spfa 和 Dij + heap
最好都不要用stl,这题卡时间。
代码如下:700msAC
#include<iostream>
using namespace std;
#define SIZE 50010
struct edge{int to, value, next;}y[SIZE * 2];
int t, v, e, x[SIZE], from, to, va, que[SIZE * 10], vst[SIZE],
id;
int sta[SIZE], cnt;
long long d[SIZE];
void spfa()
{