题目大意:给出n个点,m条无向边,每条边有长度。求一棵树,要求树上的每个点到源点距离最小的前提下,使得树上的边的长度和最小。输出树上边的总长度,以及树上的边的序号(按输入顺序 1...m).

思路 :单源最短路径 + 贪心 .用Dijkstra 或spfa 算法 求每个点到源点的最短路径,并在记录当前用来更新每个点最短距离的那条边(即pre[i]记录点i所对应的变)。

    若当前这条边能使得某个点到源点的距离变小则更新该点到源点的距离,并记录更新该点的边; 若当前这条边更新某节点后,使得该点到源点的距离不变(即:d[e[t].to] = d[e[t].from] + e[t].length ) 则比较这条边与当前该点所记录的边的长度大小,若这条边比改点所记录的边长度要小(即e[pre[e[t].to]].length > e[t].length),则更新改点所记录的边(pre[e[t].to] = t)。

代码 :

  1. #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<queue>
    #define INF 0x7fffffffffffffff
    #define pii pair<long long,long long>
    using namespace std;
    long long s,n,m,pre[300002],tag[600002],u[600002],v[600002],next[600002],first[300002];
    long long sum,d[300002],w[600002];
    priority_queue<pii,vector<pii>,greater<pii> > Q;
    bool vis[300002]; void input(){
    long long i,j,a,b,c;
    for(i=1;i<=n;i++)
    first[i] = -1;
    for(i=1;i<=m;i++){
    scanf("%I64d %I64d %I64d",&u[i],&v[i],&w[i]);
    u[i+m] = v[i] ;
    v[i+m] = u[i] ;
    w[i+m] = w[i] ;
    next[i] = first[u[i]];
    first[u[i]] = i ;
    next[i+m] = first[v[i]];
    first[v[i]] = i+m ;
    }
    scanf("%I64d",&s);
    } void Dijkstra(){
    long long i,j;
    memset(vis,0,sizeof(vis));
    memset(tag,0,sizeof(tag));
    for(i=1;i<=n;i++)
    pre[i] = -1 ;
    for(i=1;i<=n;i++)
    d[i] = INF;
    d[s] = 0;
    Q.push(make_pair(d[s],s));
    while(!Q.empty()){
    pii t = Q.top();
    Q.pop();
    long long x = t.second;
    if(vis[x])
    continue;
    vis[x] = true;
    for(long long e=first[x]; e!=-1; e=next[e]){
    if(d[v[e]] > d[x] + w[e] && d[x] < INF){
    pre[v[e]] = e;
    d[v[e]] = d[x] + w[e] ;
    Q.push(make_pair(d[v[e]],v[e]));}elseif(d[v[e]]== d[x]+ w[e]&& d[x]< INF && w[pre[v[e]]]> w[e]){
    pre[v[e]]= e;
    Q.push(make_pair(d[v[e]],v[e]));}}}}int main(){longlong i,j;while(scanf("%I64d%I64d",&n,&m)==2){
    input();
    sum =0;Dijkstra();for(i=1;i<=n;i++){
    sum += w[pre[i]];
    tag[pre[i]]=1;} printf("%I64d\n",sum);longlong count =0;for(i=1;i<=2*m;i++)if(tag[i]){if(i > m){if(count !=0)
    printf(" %I64d",i-m);else
    printf("%I64d",i-m);}elseif(i<=m){if(count !=0)
    printf(" %I64d",i);else
    printf("%I64d",i);}
    count ++;}
    printf("\n");}return0;}

CF 545E Paths and Trees的更多相关文章

  1. Codeforces 545E. Paths and Trees 最短路

    E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...

  2. 545E. Paths and Trees

    题目链接 题意:给定一个无向图和一个点u,找出若干条边组成一个子图,要求这个子图中u到其他个点的最短距离与在原图中的相等,并且要求子图所有边的权重之和最小,求出最小值并输出子图的边号. 思路:先求一遍 ...

  3. Codeforces 545E. Paths and Trees[最短路+贪心]

    [题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...

  4. [Codeforces 545E] Paths and Trees

    [题目链接] https://codeforces.com/contest/545/problem/E [算法] 首先求 u 到所有结点的最短路 记录每个节点最短路径上的最后一条边         答 ...

  5. codeforces 545E E. Paths and Trees(单源最短路+总权重最小)

    E. Paths and Trees time limit per test:3 seconds memory limit per test:256 megabytes input:standard ...

  6. Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心

    题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...

  7. Codeforces Round #303 (Div. 2)E. Paths and Trees 最短路

    E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  8. Codeforces Round #303 (Div. 2) E. Paths and Trees Dijkstra堆优化+贪心(!!!)

    E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  9. Codeforces Paths and Trees

    Paths and Trees time limit per test3 seconds memory limit per test256 megabytes Little girl Susie ac ...

随机推荐

  1. HIbernate Oracle存储过程

    之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量 ...

  2. hdu1824-Let's go home:图论2-SAT

    关键在于找出一定矛盾的条件,设一队的3个人为(a,b,c),a为队长,那么(a不留下,b不留下)矛盾,(a不留下,c不留下)矛盾; 对于每一对队员,(a留下,b留下)矛盾. 把模型建好,剩下的就是套模 ...

  3. Jsensation | 氪加

    Jsensation | 氪加 www.jsensation.com

  4. PHP常用魔术方法(__toString魔术方法)

    <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload_register('\\ ...

  5. poj 1979 Red and Black(dfs水题)

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  6. Grizzly开发Echoserver实战

    Grizzly开发Echoserver实战 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 用Java编写可伸缩的server应用是有难度的.用Java ...

  7. windows系统还原

    windows系统还原 windows 系统还原有两种方法: 方法一.开始-控制面板-系统和安全-备份和还原 (或者开始—所有程序—附件—系统工具—系统还原) 详细请看下面的截图说明 方法二.开机的时 ...

  8. 使用CMD连接SQL Server

      在CMD中操作数据库,界面不美观,而且排版不整齐,但在机器上没有安装SQLSERVER的时候,也是极其方便的.   在命令行中输入 OSQL ?可以获得所有帮助信息   osql -S 数据库服务 ...

  9. VS2015打开工程文件卡死

    今天偶然遇到VS2015打开某个工程文件卡死,一直等待无响应: 关闭VS,打开另外一个工程文件是正常的: 开始怀疑是工程文件有问题,用VS2013打开是正常的,排除工程文件问题: 删除对应工程文件下的 ...

  10. 去空格 whitespaceAndNewlineCharacterSet

    http://blog.csdn.net/worn_nest/article/details/10155495