zoukankan      html  css  js  c++  java
  • 51nod 1443 路径和树(单元最短路径)

    分析:很容易想到先搞一遍单源最短路径,然后只保留最短路径上的边,接下来容易想到最小生成树,但是因为有的边只删了一个方向,所以变成了有向图了,要求的就是最小树形图,比较麻烦而且容易T。。。

    实际上,考虑在连好的图里加一个点,肯定是加连向它的最短边,类似贪心的思路,所以结果就是删完后的图中,每个点的最小前驱边权的和。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #include<vector>
     6 #include<algorithm>
     7 using namespace std;
     8 typedef long long ll;
     9 const int maxn=3e5+5;
    10 const ll inf=1e18;
    11 struct Edge{
    12     int u,v;
    13     ll w;
    14     Edge(int _u,int _v,ll _w):u(_u),v(_v),w(_w){}
    15 };
    16 bool Cmp(Edge a,Edge b){
    17     return a.w<b.w;
    18 }
    19 vector<Edge> edges;
    20 vector<int>G[maxn];
    21 void AddEdge(int u,int v,ll w){
    22     edges.push_back(Edge(u,v,w));
    23     edges.push_back(Edge(v,u,w));
    24     G[u].push_back(edges.size()-2);
    25     G[v].push_back(edges.size()-1);
    26 }
    27 
    28 int u,n,m;
    29 ll dis[maxn];
    30 ll pre[maxn];
    31 bool inq[maxn];
    32 void spfa(){
    33     memset(inq,0,sizeof(inq));
    34     memset(pre,0,sizeof(pre));
    35     for(int i=1;i<=n;i++)dis[i]=inf;
    36     queue<int> Q;
    37     Q.push(u);
    38     inq[u]=true;
    39     dis[u]=0;
    40     while(!Q.empty()){
    41         int x=Q.front();Q.pop();
    42         inq[x]=false;
    43         for(int i=0;i<G[x].size();i++){
    44             Edge &e=edges[G[x][i]];
    45             if(dis[e.v]>dis[e.u]+e.w){
    46                 dis[e.v]=dis[e.u]+e.w;
    47                 pre[e.v]=e.w;
    48                 if(!inq[e.v]){inq[e.v]=true;Q.push(e.v);}
    49             }
    50             else if(dis[e.v]==dis[e.u]+e.w)pre[e.v]=min(pre[e.v],e.w);
    51         }
    52     }
    53 }
    54 int main(){
    55 //    freopen("e:\in.txt","r",stdin);
    56     int from,to;
    57     ll weight;
    58     scanf("%d%d",&n,&m);
    59     for(int i=0;i<m;i++){
    60         scanf("%d%d%lld",&from,&to,&weight);
    61         AddEdge(from,to,weight);
    62     }
    63     scanf("%d",&u);
    64     spfa();
    65     ll ans=0;
    66     for(int i=1;i<=n;i++){
    67         ans+=pre[i];
    68     }
    69     printf("%lld
    ",ans);
    70     return 0;
    71 }
  • 相关阅读:
    链路的有效性检测 及 基于TCP的通信为什么需要RETRY
    python join
    协程
    python socket 选项
    Spring @Resource、@Autowired、@Qualifier的区别
    maven插件
    代码中的特殊注释
    AOP 底层技术比较
    关于Android开发中的证书和密钥等问题
    tomcat部署web项目的3中方法
  • 原文地址:https://www.cnblogs.com/7391-KID/p/7634787.html
Copyright © 2011-2022 走看看