心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
此题数据极弱。一开始我还想到对边排序之后在搜索,后来看了题解之后发现完全没有必要!有一点要注意:题目中说不能重复走一条边,但是没有说不能走重复顶点!
以下是我的代码:
#include<stdio.h>
#define MAXN 108
#define MAXINT 200000008
long n,m,tl,v,c[MAXN][MAXN],t[MAXN][MAXN];
long ansc,anst,used[MAXN][MAXN]={0};
void init()
{
    
long i,j,a,b,t1,t2;
    scanf(
"%ld%ld%ld%ld",&n,&m,&tl,&v);
    
for(i=0;i<=n;i++)
      
for(j=0;j<=n;j++)
      
{
         c[i][j]
=0;
         t[i][j]
=MAXINT;
         used[i][j]
=0;
      }

    
for(i=1;i<=m;i++)
    
{
       scanf(
"%ld%ld%ld%ld",&a,&b,&t1,&t2);
       t[a][b]
=t[b][a]=t1;
       c[a][b]
=c[b][a]=t2;
    }

    
// Read In
    ansc=0;anst=MAXINT;
    
// Ready
}

void dfs(long x,long cc,long tt)
{
    
long i;
    
if(tt>tl) return;
    
if(cc>v) return;
    
if(x==n)
    
{
       
if(cc>ansc)
       
{
          ansc
=cc;
          anst
=tt;
       }

       
else if(cc==ansc&&tt<anst)
         anst
=tt;
       
return;
    }

    
for(i=1;i<=n;i++)
    
{
       
if(c[x][i]!=0&&!used[x][i])
       
{
          used[x][i]
=used[i][x]=1;
          dfs(i,cc
+c[x][i],tt+t[x][i]);
          used[x][i]
=used[i][x]=0;
       }

    }

}

int main()
{
    init();
    dfs(
1,0,0);
    printf(
"%ld %ld\n",anst,v-ansc);
// getchar();getchar();
return 0;
}

posted on 2010-01-06 20:11 lee1r 阅读(230) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理