• bzoj 1922: [Sdoi2010]大陆争霸


     1 #include<cstdio>
     2 #include<iostream>
     3 #define M 7009
     4 #define ll long long
     5 #define inf 1000000000
     6 using namespace std;
     7 int cnt,n,m,head[M],next[10*M],u[10*M],v[10*M],sum[M];
     8 int sum1[M],head1[M],next1[10*M],u1[10*M],f[M],cnt1,fr[M];
     9 int  d[M],d1[M];
    10 void jia(int a1,int a2,int a3)
    11 {
    12     cnt++;
    13     next[cnt]=head[a1];
    14     head[a1]=cnt;
    15     u[cnt]=a2;
    16     v[cnt]=a3;
    17     return;
    18 }
    19 void jia1(int a1,int a2)
    20 {
    21     cnt1++;
    22     next1[cnt1]=head1[a1];
    23     head1[a1]=cnt1;
    24     u1[cnt1]=a2;
    25     return;
    26 }
    27 int main()
    28 {
    29     scanf("%d%d",&n,&m);
    30     for(int i=1;i<=m;i++)
    31       {
    32         int a1,a2,a3;
    33         scanf("%d%d%d",&a1,&a2,&a3);
    34         jia(a1,a2,a3);
    35       }
    36     for(int i=1;i<=n;i++)
    37       {
    38         scanf("%d",&sum[i]);
    39         for(int j=1;j<=sum[i];j++)
    40           {
    41             int a1;
    42             scanf("%d",&a1);
    43             jia1(a1,i);
    44           }
    45       }
    46     for(int i=1;i<=n;i++)
    47       d[i]=inf;
    48     d[1]=0;
    49     for(int i=1;i<=n;i++)
    50       {
    51         int minn=inf,min1;
    52         for(int j=1;j<=n;j++)
    53           if(!f[j]&&sum1[j]==sum[j])
    54             {
    55                 int a1=max(d[j],d1[j]);
    56                 if(minn>a1)
    57                   {
    58                     minn=a1;
    59                     min1=j;
    60                   }
    61             }
    62         f[min1]=1;
    63         d[min1]=minn;
    64         if(f[n])
    65           break;
    66         for(int j=head[min1];j;j=next[j])
    67           if(d[u[j]]>minn+v[j])
    68             {
    69               d[u[j]]=minn+v[j];
    70               fr[u[j]]=min1;
    71             }
    72         for(int j=head1[min1];j;j=next1[j])
    73           {
    74             sum1[u1[j]]++;
    75             d1[u1[j]]=max(d1[u1[j]],minn);
    76           }
    77       }
    78     int b1=n;
    79     printf("%d
    ",d[n]);
    80     return 0;
    81 }

    跑DJ每次找最小值更新时,看保护他的是否全找完了。

  • 相关阅读:
    MFC中L, _T(),TEXT,_TEXT区别以及含义
    Qt5完美解决 界面显示中文乱码
    TCP三次握手四次挥手详解
    TCP 长连接与短连接的区别
    Servlet 生命周期、工作原理
    Java反射的三种实现方式
    apache httpclient 4.5 兼容 http https
    mysql千万级大数据SQL查询优化
    Java String字符串补0或空格
    mysql存储过程
  • 原文地址:https://www.cnblogs.com/xydddd/p/5290267.html
Copyright © 2020-2023  润新知