zoukankan      html  css  js  c++  java
  • poj3592Instantaneous Transference(tarjan+spfa)

    http://poj.org/problem?id=3592提交了30多次了 受不了了 两份的代码基本上一样了 一个AC一个WA 木办法 贴份别人的吧 改得跟我得一样 人家能A  我是WA。。

    强连通分量缩点 用spfa算出最长路 注意算强连通时加过的值就不再加了

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <iostream>
      4 #include <vector>
      5 #include <queue>
      6 #include<stack>
      7 using namespace std;
      8 const int NN=1606;
      9 const int MM=1000000;
     10 const int INF=0x3fffffff;
     11 
     12 int n,m,w[NN],val[NN];
     13 char c[42][42];
     14 vector<int> adj[NN];
     15 
     16 struct Edge{
     17     int u,v,next;
     18 }edge[MM];
     19 int t,head[NN];
     20 void addedge(int u,int v)
     21 {
     22     edge[t].u=u;
     23     edge[t].v=v;
     24     edge[t].next=head[u];
     25     head[u]=t++;
     26 }
     27 
     28 int bcnt,top,depth,dfn[NN],low[NN],belong[NN],vis[NN],instack[NN];
     29 //bool instack[NN];
     30 stack<int>s;
     31 void init()
     32 {
     33     t=0;
     34     memset(head,-1,sizeof(head));
     35 }
     36 void tarjan(int u)
     37 {
     38     dfn[u]=low[u]=++depth;
     39     s.push(u);
     40     instack[u] = 1;
     41     int v;
     42     for (int i=head[u]; i!=-1; i=edge[i].next)
     43     {
     44         v=edge[i].v;
     45         if (!dfn[v])
     46         {
     47             tarjan(v);
     48             low[u]=min(low[u],low[v]);
     49         }
     50         else if (instack[v])
     51             low[u]=min(low[u],dfn[v]);
     52     }
     53     if (low[u]==dfn[u])
     54     {bcnt++;
     55         val[bcnt] = 0;
     56         adj[bcnt].clear();
     57         for(;;)
     58         {
     59             v=s.top();
     60             s.pop();
     61             belong[v]=bcnt;
     62             val[bcnt]+=w[v];instack[v] = 0;
     63             if(v==u)
     64             break;
     65         }
     66 
     67     }
     68 }
     69 int dis[NN];
     70 int lpfa(int S)
     71 {
     72     for (int i=1; i<=bcnt; i++) dis[i]=-INF;
     73     memset(vis,0,sizeof(vis));
     74     dis[S]=0;
     75     queue<int> q;
     76     q.push(S);
     77     while (!q.empty())
     78     {
     79         int u=q.front();
     80         vis[u]=0;
     81         q.pop();
     82         for (int i=0; i<adj[u].size(); i++)
     83         {
     84             int v=adj[u][i];
     85             if (dis[v]<dis[u]+val[v])
     86             {
     87                 dis[v]=dis[u]+val[v];
     88                 if (!vis[v])
     89                 {
     90                     vis[v]=1;
     91                     q.push(v);
     92                 }
     93             }
     94         }
     95     }
     96     int ret=0;
     97     for (int i=1; i<=bcnt; i++) if (dis[i]>ret) ret=dis[i];
     98     return ret+val[S];
     99 }
    100 void find(int n)
    101 {
    102    memset(dfn,0,sizeof(dfn));
    103    memset(instack,0,sizeof(instack));
    104    memset(val,0,sizeof(val));
    105    memset(low,0,sizeof(low));
    106    bcnt=depth=0;
    107    for(int i = 0 ; i < n ; i++)
    108    if (!dfn[i]) tarjan(i);
    109 }
    110 int main()
    111 {
    112     int cas;
    113     scanf("%d",&cas);
    114     while (cas--)
    115     {
    116         scanf("%d%d",&n,&m);
    117         for (int i=0; i<n; i++)
    118         {
    119             getchar();
    120             for (int j=0; j<m; j++) c[i][j]=getchar();
    121         }
    122         init();
    123         int x,y;
    124         for (int i=0; i<n; i++)
    125           for (int j=0; j<m; j++)
    126           {
    127               int u= i*m+j;
    128               if (c[i][j]=='*')
    129               {
    130                   w[u]=0;
    131                   scanf("%d%d",&x,&y);
    132                   addedge(u,x*m+y);
    133               }
    134               else w[u]=c[i][j]-'0';
    135               if (c[i][j]=='#') { w[u]=0; continue; }
    136               if (i!=n-1 && c[i+1][j]!='#') addedge(u,u+m);
    137               if (j!=m-1 && c[i][j+1]!='#') addedge(u,u+1);
    138           }
    139         find(n*m);
    140         int u,v;
    141         for (int i=0; i<t; i++)
    142         {
    143             u=edge[i].u; v=edge[i].v;
    144             if (belong[u]!=belong[v]) adj[belong[u]].push_back(belong[v]);
    145         }
    146         printf("%d
    ",lpfa(belong[0]));
    147     }
    148     return 0;
    149 }
    View Code
  • 相关阅读:
    HDU 1301 Jungle Roads (最小生成树)
    POJ 1733 Parity game (并查集)
    HDU 3038 How Many Answers Are Wrong (并查集)
    CentOS用yum安装搭建LAMP
    Linux下php安装Redis扩展
    PHPExcel用法
    利用phpmailer类邮件发送
    Vim编辑器配置
    vhost文件设置
    ThinkPHP验证码类
  • 原文地址:https://www.cnblogs.com/shangyu/p/3143768.html
Copyright © 2011-2022 走看看