http://codeforces.com/contest/545/problem/E
题意:给一个无向图G,一个起点U,要求找到一个子图,【子图中U到各点的最短路与原图相等】,求出 【所有边权之和最小的】 一个子图
输出权值和 +每条边的编号 (边按输入的顺序从一到m编号)
思路:直接求一遍最短路,得到dist[]数组
然后
for (i=1;i<=n; i++)
{
//遍历与点i相连的所有边,如果能找到一条 边使得 【起点到i 点 的dist不变】且 【边权比原来的小】,就更新掉子图的边
}
求最小权值和这部分复杂度O(m)
求最短路(n+m)log(n)
总复杂度还是(n+m)log(n)......
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define INF 9223372036854775807
const __int64 maxn = 300005;
struct EDGE
{
__int64 u;
__i