| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴代码 (Tarjan强连通缩点+记忆化dfs) 很多人都用spfa,但我觉得不必要,如果用spfa,代码长得多。
记忆花DFS的代码:
#include <cstring>
#include <cstdio>
#define P 1605
#define E 4805
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
struct Edge{
int cnt,x[E],y[E],nxt[E],fst[P];
void set(){
cnt=0;
memset(x,0,sizeof x);
memset(y,0,sizeof y);
memset(nxt,0,sizeof nxt);
memset(fst,0,sizeof fst);
}
void add(int a,int b){
if (a==b)
return;
y[++cnt]=b;
x[cnt]=a;
nxt[cnt]=fst[a];
fst[a]=cnt;
}
}e,e2;
int n,m,Px,Py,wei[P],we2[P];
int inst[P],st[P],vis[P],dfn[P],low[P],bh[P],ans,time,top;
int dp[P];
char str[42][42];
int Turn(int x,int y){
return x*m+y+1;
}
void Turn_back(int x,int &a,int &b){
x--;
a=x/m;
b=x%m;
}
void Tarjan_init(){
ans=time=top=0;
memset(inst,0,sizeof inst);
memset(st,0,sizeof st);
memset(vis,0,sizeof vis);
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
memset(bh,0,sizeof bh);
}
void Tarjan(int x){
dfn[x]=low[x]=++time;
st[++top]=x;
inst[x]=vis[x]=1;
for (int i=e.fst[x];i;i=e.nxt[i])
if (!vis[e.y[i]]){
Tarjan(e.y[i]);
low[x]=min(low[x],low[e.y[i]]);
}
else if (inst[e.y[i]])
low[x]=min(low[x],low[e.y[i]]);
if (dfn[x]==low[x]){
ans++;
bh[st[top]]=ans;
inst[st[top]]=0;
while (st[top--]!=x){
bh[st[top]]=ans;
inst[st[top]]=0;
}
}
}
int dfs(int x){// Remembered Dfs
if (dp[x]>-1)
return dp[x];
dp[x]=0;
for (int i=e2.fst[x];i;i=e2.nxt[i])
dp[x]=max(dp[x],dfs(e2.y[i]));
dp[x]+=we2[x];
return dp[x];
}
int main(){
int T;
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
scanf("%s",str[i]);
for (int i=0;i<42;i++)
str[i][m]=str[n][i]='#';
e.set();
for (int i=0;i<n;i++)
for (int j=0;j<m;j++){
if (str[i][j]=='#'||str[i][j]=='*')
wei[Turn(i,j)]=0;
else
wei[Turn(i,j)]=str[i][j]-'0';
if (str[i][j]=='#')
continue;
if (str[i+1][j]!='#')
e.add(Turn(i,j),Turn(i+1,j));
if (str[i][j+1]!='#')
e.add(Turn(i,j),Turn(i,j+1));
if (str[i][j]=='*'){
scanf("%d%d",&Px,&Py);
if (str[Px][Py]=='#')
continue;
e.add(Turn(i,j),Turn(Px,Py));
}
}
Tarjan_init();
for (int i=1;i<=Turn(n-1,m-1);i++){
Turn_back(i,Px,Py);
if (str[Px][Py]=='#')
continue;
if (!vis[i])
Tarjan(i);
}
memset(we2,0,sizeof we2);
for (int i=1;i<=Turn(n-1,m-1);i++)
we2[bh[i]]+=wei[i];
e2.set();
for (int i=1;i<=e.cnt;i++)
e2.add(bh[e.x[i]],bh[e.y[i]]);
for (int i=1;i<=ans;i++)
dp[i]=-1;
int res=dfs(bh[Turn(0,0)]);
printf("%d\n",res);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator