• poj 3592 Instantaneous Transference


    http://poj.org/problem?id=3592

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <queue>
      5 #define maxn 300000
      6 using namespace std;
      7 
      8 const int inf=-1<<30;
      9 int e,head[maxn],belong[maxn],stack1[maxn],top,dfn[maxn],low[maxn],bcc_clock,bcnt,n,m,num1[100][100],num,gg[maxn],point[maxn],cc[maxn],ee,head1[maxn],dis[maxn],cnt[maxn],temp;
     10 bool vis[maxn],visi[maxn];
     11 int dir[2][2]= {{0,1},{1,0}};
     12 struct node
     13 {
     14     int u,v,next;
     15 } p[maxn];
     16 struct node1
     17 {
     18     int u,v,w,next;
     19 } pp[maxn];
     20 char g[50][50];
     21 
     22 void add(int u,int v)
     23 {
     24     p[e].u=u;
     25     p[e].v=v;
     26     p[e].next=head[u];
     27     head[u]=e++;
     28 }
     29 
     30 void addnode(int u,int v,int w)
     31 {
     32     pp[ee].v=v;
     33     pp[ee].u=u;
     34     pp[ee].w=w;
     35     pp[ee].next=head1[u];
     36     head1[u]=ee++;
     37 }
     38 
     39 void tarjan(int u)
     40 {
     41     vis[u]=true;
     42     dfn[u]=low[u]=++bcc_clock;
     43     stack1[++top]=u;
     44     for(int i=head[u]; i!=-1; i=p[i].next)
     45     {
     46         int v=p[i].v;
     47         if(!dfn[v])
     48         {
     49             tarjan(v);
     50             low[u]=min(low[u],low[v]);
     51         }
     52         else if(vis[v])
     53             low[u]=min(low[u],dfn[v]);
     54     }
     55     if(dfn[u]==low[u])
     56     {
     57         bcnt++;
     58         int j;
     59         do
     60         {
     61             j=stack1[top--];
     62             vis[j]=false;
     63             belong[j]=bcnt;
     64         }
     65         while(j!=u);
     66     }
     67 }
     68 
     69 void init()
     70 {
     71 
     72     memset(dfn,0,sizeof(dfn));
     73     memset(low,0,sizeof(low));
     74     memset(belong,0,sizeof(belong));
     75     memset(cc,0,sizeof(cc));
     76     memset(vis,false,sizeof(vis));
     77 }
     78 
     79 void del()
     80 {
     81     init();
     82     for(int i=0; i<n*m; i++)
     83     {
     84         if(!dfn[i])
     85         {
     86             tarjan(i);
     87         }
     88     }
     89 }
     90 
     91 bool ralex(int u,int v,int c)
     92 {
     93     if(dis[v]<dis[u]+c)
     94     {
     95         dis[v]=dis[u]+c;
     96         return true;
     97     }
     98     return false;
     99 }
    100 
    101 
    102 
    103 bool spfa(int src)
    104 {
    105     memset(visi,false,sizeof(visi));
    106     memset(cnt,0,sizeof(cnt));
    107     visi[src]=true;
    108     for(int i=0; i<=bcnt; i++)
    109     {
    110         dis[i]=inf;
    111     }
    112     queue<int>q;
    113     q.push(src);
    114     dis[src]=0;
    115     while(!q.empty())
    116     {
    117         int u=q.front();
    118         q.pop();
    119         visi[u]=false;
    120         for(int i=head1[u]; i!=-1; i=pp[i].next)
    121         {
    122             if(ralex(u,pp[i].v,pp[i].w)&&!visi[pp[i].v])
    123             {
    124                 if((++cnt[pp[i].v])>n*m) return false;
    125                 q.push(pp[i].v);
    126                 visi[pp[i].v]=true;
    127             }
    128         }
    129     }
    130     temp=0;
    131     for(int i=1; i<bcnt+1; i++)
    132     {
    133         temp=max(temp,dis[i]);
    134     }
    135     return true;
    136 }
    137 int main()
    138 {
    139     int t;
    140     scanf("%d",&t);
    141     while(t--)
    142     {
    143         scanf("%d%d",&n,&m);
    144         num=0;
    145         int cn=0;
    146         memset(head1,-1,sizeof(head1));
    147         memset(head,-1,sizeof(head));
    148         e=0,top=0,bcnt=0,bcc_clock=0,ee=0;
    149         getchar();
    150         for(int i=0; i<n; i++)
    151         {
    152             scanf("%s",g[i]);
    153         }
    154         for(int i=0; i<n; i++)
    155         {
    156             for(int j=0; j<m; j++)
    157             {
    158                 int k=i*m+j;
    159                 if(g[i][j]=='#')
    160                 {
    161                     gg[k]=-1;
    162                     continue;
    163                 }
    164                 else
    165                 {
    166                     if(g[i][j]=='*')
    167                     {
    168                         point[cn++]=k;
    169                         gg[k]=0;
    170                     }
    171                     else if(g[i][j]>='0'&&g[i][j]<='9')
    172                     {
    173                         gg[k]=g[i][j]-'0';
    174                     }
    175                     for(int c=0; c<2; c++)
    176                     {
    177                         int xx=i+dir[c][0];
    178                         int yy=j+dir[c][1];
    179                         if(xx<n&&yy<m)
    180                         {
    181                             if(g[xx][yy]!='#')
    182                             {
    183                                 add(k,xx*m+yy);
    184                             }
    185                         }
    186                     }
    187 
    188                 }
    189             }
    190         }
    191         for(int i=0; i<cn; i++)
    192         {
    193             int x,y;
    194             scanf("%d%d",&x,&y);
    195             if(g[x][y]!='#')
    196             {
    197                 add(point[i],x*m+y);
    198             }
    199         }
    200         del();
    201         for(int i=0; i<n*m; i++)
    202         {
    203             cc[belong[i]]+=gg[i];
    204         }
    205         addnode(0,belong[0],cc[belong[0]]);
    206         for(int i=0; i<n*m; i++)
    207         {
    208             for(int j=head[i]; j!=-1; j=p[j].next)
    209             {
    210                 int v=p[j].v;
    211                 if(belong[i]!=belong[v])
    212                 {
    213                     addnode(belong[i],belong[v],cc[belong[v]]);
    214                 }
    215             }
    216         }
    217         spfa(0);
    218         printf("%d
    ",temp);
    219     }
    220     return 0;
    221 }
    View Code
  • 相关阅读:
    javascript实现根据时间段显示问候语的方法
    视觉会议收藏一
    cv的期刊和会议
    CVPR2016 Paper list
    CVPR 2017 Paper list
    关注的牛人
    cvpr2016论文
    linux命令技巧:scp多文件远程拷贝
    linux命令技巧--df -lh:查看磁盘占用情况
    spark--01编译安装spark1.3.1
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3551563.html
Copyright © 2020-2023  润新知