http://poj.org/problem?id=3411
这题RE了N多次,到最后也不知道是什么原因。看到网上说vis[x]不会超过3,就试着加上了<=3的限制,我了个去,马上AC!
问题应该还是递归过程爆栈了吧。
code:
#include<cstdio>
#include<cstring>
const int MAX = 99999999 ;
int vis[15] ;
int ans, n, m ;
bool flag ;
struct node{
int a ;
int b ;
int c ;
int p ;
int r ;
}q[15] ;
void dfs(int i, int v){
if(v>ans) return ;
if(i==n){
flag = true ;
ans = v ;
return ;
}
for(int j=0; j<m; j++){
if(q[j].a!=i) continue ;
if(vis[q[j].b]<=3){
vis[q[j].b] ++ ;
if(vis[q[j].c]) dfs(q[j].b, q[j].p + v) ;
else dfs(q[j].b, q[j].r + v) ;
vis[q[j].b] -- ;
}
}
}
int main(){
int i, j, a ;
while(~scanf("%d%d", &n, &m)){
memset(vis, 0, sizeof(vis)) ;
memset(q, 0, sizeof(q)) ;
flag = false ;
ans = MAX ;
for(i=0; i<m; i++)
scanf("%d%d%d%d%d", &q[i].a, &q[i].b, &q[i].c, &q[i].p, &q[i].r) ;
dfs(1, 0) ;
if(flag) printf("%d\n", ans) ;
else printf("impossible\n") ;
}
return 0 ;}
#include<cstring>
const int MAX = 99999999 ;
int vis[15] ;
int ans, n, m ;
bool flag ;
struct node{
int a ;
int b ;
int c ;
int p ;
int r ;
}q[15] ;
void dfs(int i, int v){
if(v>ans) return ;
if(i==n){
flag = true ;
ans = v ;
return ;
}
for(int j=0; j<m; j++){
if(q[j].a!=i) continue ;
if(vis[q[j].b]<=3){
vis[q[j].b] ++ ;
if(vis[q[j].c]) dfs(q[j].b, q[j].p + v) ;
else dfs(q[j].b, q[j].r + v) ;
vis[q[j].b] -- ;
}
}
}
int main(){
int i, j, a ;
while(~scanf("%d%d", &n, &m)){
memset(vis, 0, sizeof(vis)) ;
memset(q, 0, sizeof(q)) ;
flag = false ;
ans = MAX ;
for(i=0; i<m; i++)
scanf("%d%d%d%d%d", &q[i].a, &q[i].b, &q[i].c, &q[i].p, &q[i].r) ;
dfs(1, 0) ;
if(flag) printf("%d\n", ans) ;
else printf("impossible\n") ;
}
return 0 ;}