题意

求一个生成树,使得任意点到源点的最短路等于原图中的最短路。再让这个生成树边权和最小。

http://codeforces.com/contest/545/problem/E

思路

先Dijkstra一下,再对每个点连的边判断是不是最短路上的边,如果是那再贪心取最小的边即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=1e18;
const int N=6e5+5;
struct qnode
{
ll v;
ll c;
qnode(ll _v=0,ll _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
};
struct edge
{
ll v,cost;
int next;
};
edge eg[N];
int head[N];
ll dist[N],tot=1;
bool vis[N];
void Dijkstra(int n,int sta)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++) dist[i]=inf;
priority_queue<qnode> pq;
dist[sta]=0;
pq.push(qnode(sta,0));
qnode tmp;
while(!pq.empty())
{
tmp=pq.top();
pq.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=head[u];~i;i=eg[i].next)
{
int v=eg[i].v;
int cost=eg[i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
pq.push(qnode(v,dist[v]));
}
}
}
}
void init()
{
memset(head,-1,sizeof(head));
tot=1;
}
void addedge(int u,int v,ll w)
{
eg[tot].v=v;
eg[tot].cost=w;
eg[tot].next=head[u];
head[u]=tot++;
}
int main()
{
int n,m;
init();
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int u,v;
ll w;
scanf("%d%d%lld",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
int rt;
scanf("%d",&rt);
Dijkstra(n,rt);
vector<int> ans;
ll sum=0;
for(int i=1;i<=n;i++)
{
if(i!=rt)
{
ll mn=inf,mi;
for(int j=head[i];~j;j=eg[j].next)
{
int v=eg[j].v;
if(dist[i]==dist[v]+eg[j].cost)
{
if(mn>eg[j].cost)
{
mn=eg[j].cost;
mi=(j+1)/2;
}
}
}
ans.push_back(mi);
sum+=mn;
}
}
printf("%lld\n",sum);
for(int i : ans)
{
printf("%d ",i);
}
puts("");
return 0;
}

Codeforces Round #303 (Div. 2)(CF545) E Paths and Trees(最短路+贪心)的更多相关文章

  1. 水题 Codeforces Round #303 (Div. 2) D. Queue

    题目传送门 /* 比C还水... */ #include <cstdio> #include <algorithm> #include <cstring> #inc ...

  2. DP Codeforces Round #303 (Div. 2) C. Woodcutters

    题目传送门 /* 题意:每棵树给出坐标和高度,可以往左右倒,也可以不倒 问最多能砍到多少棵树 DP:dp[i][0/1/2] 表示到了第i棵树时,它倒左或右或不动能倒多少棵树 分情况讨论,若符合就取最 ...

  3. 贪心 Codeforces Round #303 (Div. 2) B. Equidistant String

    题目传送门 /* 题意:找到一个字符串p,使得它和s,t的不同的总个数相同 贪心:假设p与s相同,奇偶变换赋值,当是偶数,则有答案 */ #include <cstdio> #includ ...

  4. 水题 Codeforces Round #303 (Div. 2) A. Toy Cars

    题目传送门 /* 题意:5种情况对应对应第i或j辆车翻了没 水题:其实就看对角线的上半边就可以了,vis判断,可惜WA了一次 3: if both cars turned over during th ...

  5. 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 ...

  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 input standard ...

  7. 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 ...

  8. Codeforces Round #303 (Div. 2)

    A.Toy Cars 题意:给出n辆玩具车两两碰撞的结果,找出没有翻车过的玩具车. 思路:简单题.遍历即可. #include<iostream> #include<cstdio&g ...

  9. Codeforces Round #303 (Div. 2) D. Queue 傻逼题

    C. Woodcutters Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/probl ...

随机推荐

  1. 具名插槽 slot (二)

    slot 是父组件与子组件的通信方式可以将父组件的内容显示在子组件当中或者说可以将 让你封装的组件变的更加的灵活,强壮! 在子组件中  通过为多个slot进行命名.来接受父组件中的不同内容的数据  这 ...

  2. 2019牛客多校(第一场)F-Random Point in Triangle

    #include <bits/stdc++.h> using namespace std; typedef long long ll; struct Point{ ll x, y; Poi ...

  3. 【UOJ388】配对树(dsu on tree+线段树)

    传送门 题意: 给出一颗含有\(n\)个结点的无根树,之后给出一个长度为\(m\)的序列,每个元素在\([1,n]\)之间. 现在序列中每个长度为偶数的区间的完成时间定义为树上最小配对方法中每对匹配点 ...

  4. ubuntu18.40 rtx2080ti安装显卡驱动/cuda/cudnn/tensorflow-gpu

    电脑环境 ubuntu 18.40 gpu  rtx2080ti 一.安装显卡驱动 刚开始尝试用手动安装方式安装驱动 下载了驱动程序但是因为没有gcc所以放弃这种方法 后尝试最简单的方式 在 菜单-- ...

  5. RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例

    pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...

  6. session未释放

    客户反映一个关于session的bug,说有了1,2天以后,就无法登陆了. 我们这边试了好几天,都没有出现类似问题,后来没办法,只能远程开会,7点左右和他们通话,偶然发现他们居然直接关remote d ...

  7. usb设备在sysfs中的命名规范

    "root-hub的编号"-"设备(或者hub)插入的端口号"[."设备(或者hub)插入的端口号"]:"USB设备配置号&quo ...

  8. linux jdk1.8 64位下载永久地址,ubuntu,centos,java

    https://pan.baidu.com/s/1A4cl3vUWCtiHxJ9eHK2ApQ  密码:j8dg

  9. centos6利用cgroup冻结一个程序运行

    操作步骤: 安装cgroup服务 yum install libcgroup 配置cgroup vim /etc/cgconfig.conf group stopit{ #添加一个cgroup组 fr ...

  10. dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其标签关联的其他文章地址

    dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其他标签关联的文章地址 1 添加2个自定义函数 在dede/include/extend.func.php底部 添加如下代码 //根据文 ...