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
原文地址:https://www.cnblogs.com/shangyu/p/3143768.html