zoukankan      html  css  js  c++  java
  • codevs 1173

    spfa练少了。。。WA了2次。。

     1 #include<bits/stdc++.h>
     2 #define inc(i,l,r) for(i=l;i<=r;i++)
     3 #define dec(i,l,r) for(i=l;i>=r;i--)
     4 #define inf 1e9
     5 #define mem(a) memset(a,0,sizeof(a))
     6 #define ll long long
     7 #define succ(x) (1<<x)
     8 #define NM 100000+5
     9 #define nm 1000000+5
    10 using namespace std;
    11 int read(){
    12     int x=0,f=1;char ch=getchar();
    13     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    14     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    15     return x*f;
    16 }
    17 struct edge{
    18     int s,t;
    19     edge *next,*nxt;
    20 }e[nm],*h[NM],*_h[NM];
    21 int i,n,ans,d[NM],f[NM],m,a[NM],s,_x,_y;
    22 bool v[NM];
    23 queue<int >q;
    24 void add(int x,int y){
    25     e[++s].s=x;e[s].t=y;e[s].next=h[x];e[s].nxt=_h[y];h[x]=_h[y]=&e[s];
    26 }
    27 void spfa(){
    28     inc(i,1,n)d[i]=inf;
    29     q.push(1);v[1]++;d[1]=a[1];
    30     while(!q.empty()){
    31         int t=q.front();q.pop();d[t]=min(d[t],a[t]);
    32         for(edge *j=h[t];j;j=j->next)
    33         {
    34             d[j->t]=min(d[j->t],d[t]);
    35             if(!v[j->t]){
    36                 v[j->t]++;q.push(j->t);
    37             }
    38         }
    39     }
    40 }
    41 void _spfa(){
    42     inc(i,1,n)f[i]=-inf;
    43     mem(v);
    44     q.push(n);v[n]++;f[n]=a[n];
    45     while(!q.empty()){
    46         int t=q.front();q.pop();f[t]=max(f[t],a[t]);
    47         for(edge *j=_h[t];j;j=j->nxt){
    48             f[j->s]=max(f[j->s],f[t]);
    49             if(!v[j->s]){
    50                 v[j->s]++;q.push(j->s);
    51             }
    52         }
    53     }
    54 }
    55 int main(){
    56     n=read();m=read();
    57     inc(i,1,n)a[i]=read();
    58     inc(i,1,m){
    59         _x=read();_y=read();
    60         add(_x,_y);
    61         if(read()==2)add(_y,_x);
    62     }
    63     spfa();
    64     _spfa();
    65     inc(i,1,n)
    66     ans=max(ans,f[i]-d[i]);
    67     printf("%d
    ",ans);
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    DNS
    报文组成
    简单的转义字符
    普通字符
    正则表达式介绍
    Mybatis_HelloWorld
    Mybatis介绍
    基本概念
    EGit应用
    EGit
  • 原文地址:https://www.cnblogs.com/onlyRP/p/4852963.html
Copyright © 2011-2022 走看看