每日一题

Rinne Loves Edges

https://ac.nowcoder.com/acm/problem/22598

从题目来看这就是个树啊
从题目来看这就是个树啊
从题目来看这就是个树啊
我真的好菜。。。看的好多人的题解才会&%!&%¥#……&
度为1的节点就是叶子节点
度为1的节点就是叶子节点
度为1的节点就是叶子节点
首先我们从 s 出发,那么我们不能让叶子节点走到 s 的话,我们现在有两种选择,设 u 是 s 的子节点 我们可以直接切断 u 到 s 的这条路径,或者我们进入这个子节点 切掉他的儿子到他的路,或者又进入下一层,。。。。。。一直重复当前的操作,很明显这就是个递归的过程。
无向图的存储一定要记住 * 2 啊 血淋淋的教训
无向图的存储一定要记住 * 2 啊 血淋淋的教训
无向图的存储一定要记住 * 2 啊 血淋淋的教训
另外叶子节点要单独判断 让他为无穷大
另外叶子节点要单独判断 让他为无穷大
另外叶子节点要单独判断 让他为无穷大

#include<bits/stdc++.h>
#define pr printf
#define sc scanf
#define fur(i,a,b) for(int i = a; i<= b ;i++)
#define fdr(i,a,b) for(int i = a; i>= b ;i--)
using namespace std;
typedef long long ll;
const int N = 100000 * 2 +10 ;
ll dp[N];
int head[N],nex[N],edge[N],ver[N],tot;
void add(int u,int v ,int w)
{
    ver[++tot] = v;
    edge[tot] = w;
    nex[tot] = head[u];
    head[u] = tot;
}
int d[N];
int n,m,s;
void dfs(int u,int fa)
{
    if(d[u] == 1 && u != s){
        dp[u] = 0x3f3f3f3f;
        return;
    }
    for(int i = head[u];i;i = nex[i])
    {
        int v = ver[i],w = edge[i];
        if(v != fa){
            dfs(v,u);
            dp[u] = dp[u] +min(1ll*w,dp[v]);
        }
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
    scanf("%d %d %d",&n,&m,&s);
    for(int i = 1 ;i <= m;i++)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
        ++d[u],++d[v];
    }
    dfs(s,0);
    printf("%lld\n",dp[s]);
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 14:00
白火同学:其实你可以了解一下HR在Boss聊天的机制,想赢牌的前提是先会玩牌。 如果HR长时间没有理你,有可能是因为你的消息被其他应聘者的消息给挤到下面了,HR从上到下有可能只看个三四百个人就要到理想数量的简历了,而你恰好没有被看到,时间一长,你的消息在越来越下面。这种情况就需要你自己活跃一下,把消息提上去。 也可能是HR招的合适的人选了,但会一直挂着岗位,为了省重新开招聘岗位的钱,方便后面随时修改招聘要求。 当然也可能是HR吃饱了没事耍你玩,要了你的简历又不看,就看你自己怎么理解了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务