• BZOJ1576 (最短路+并查集)


      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <queue>
      5 #define inline __attribute__((optimize("O2")))
      6 using namespace std;
      7    
      8 #define maxn 100008
      9 #define maxm 1000008
     10 #define INF 2000000000
     11 #define pa pair<int,int>
     12  
     13 struct line{
     14     int u,v,w,nt;
     15 }eg[maxm],E[maxm],e[maxm];
     16    
     17 int lt[maxn],fa[maxn],n,m,sum=1,num=0,f[maxn],ans[maxn];
     18 int d[maxn],pd[maxn];
     19    
     20 inline void add(int u,int v,int w){
     21     eg[++sum].v=v; eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum;
     22 }
     23 inline void read(int &x){
     24     char ch;
     25     for (ch=getchar();ch<'0'||ch>'9';ch=getchar()); x=ch-48;
     26     for (ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-48;
     27 }
     28    
     29 /*inline void spfa(){
     30     for (int i=1;i<=n;i++) d[i]=INF;
     31     queue<int> Q;
     32     memset(pd,0,sizeof(pd));
     33     pd[1]=1; d[1]=0; Q.push(1);
     34     while (!Q.empty()){
     35         int u=Q.front();
     36         for (int i=lt[u];i;i=eg[i].nt){
     37             int v=eg[i].v;
     38             if (d[u]+eg[i].w<d[v]){
     39                 d[v]=d[u]+eg[i].w;
     40                 fa[v]=u;
     41                 if (!pd[v]){
     42                     Q.push(v);
     43                     pd[v]=1;
     44                 }
     45             }
     46         }
     47         pd[u]=0;
     48         Q.pop();
     49     }
     50 }*/
     51  
     52 inline void dijkstra(){
     53     priority_queue<pa,vector<pa>,greater<pa> > Q;
     54     memset(pd,0,sizeof(pd));
     55     for (int i=1;i<=n;i++) d[i]=INF;
     56     d[1]=0; Q.push(make_pair(0,1));
     57     while (!Q.empty()){
     58         int u=Q.top().second; Q.pop();
     59         if (pd[u]) continue; pd[u]=1;
     60         for (int i=lt[u];i;i=eg[i].nt)
     61             if (d[u]+eg[i].w<d[eg[i].v]){
     62                 d[eg[i].v]=d[u]+eg[i].w;
     63                 fa[eg[i].v]=u;
     64                 Q.push(make_pair(d[eg[i].v],eg[i].v));
     65             }
     66     }
     67 }
     68    
     69 inline bool cmp(line i,line j){
     70     return i.w<j.w;
     71 }
     72    
     73 inline int find(int x){ return f[x]==x?x:f[x]=find(f[x]); }
     74    
     75 inline void work(int u,int v,int w){
     76     int x=find(u),y=find(v);
     77     while (x!=y){
     78         if (d[x]<d[y]) swap(x,y);
     79         ans[x]=w-d[x];
     80         num++;
     81         f[x]=fa[x];
     82         x=find(f[x]);
     83     }
     84 }
     85    
     86 inline int main(){
     87     read(n); read(m);
     88     int x,y,z;
     89     for (int i=1;i<=m;i++){
     90         read(x); read(y); read(z);
     91         add(x,y,z); add(y,x,z);
     92         e[i].u=x; e[i].v=y; e[i].w=z;
     93     }
     94     dijkstra();
     95     int cnt=0;
     96     for (int i=1;i<=m;i++){
     97         int u=e[i].u,v=e[i].v,w=e[i].w;
     98         if (fa[u]!=v && fa[v]!=u){
     99             E[++cnt].u=u;
    100             E[cnt].v=v;
    101             E[cnt].w=d[u]+d[v]+w;
    102         }
    103     }
    104     sort(E+1,E+cnt+1,cmp);
    105     for (int i=1;i<=n;i++) { ans[i]=-1; f[i]=i; }
    106     for (int i=1;i<=cnt;i++){
    107         work(E[i].u,E[i].v,E[i].w);
    108         if (num==n-1) break;      
    109     }
    110     for (int i=2;i<=n;i++) printf("%d
    ",ans[i]);
    111 }
  • 相关阅读:
    GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明
    Spring.NET 的IOC(依赖注入)
    c# post 数据的方法
    C# .NET中的 反射的应用
    C# .NET修改注册表
    DataTabel DataSet 对象 转换成json
    sqlserver 行转列
    asp.net 二级域名session共享
    Asp.Net集群中Session共享
    微软企业库DBBA的研究
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4597631.html
Copyright © 2020-2023  润新知