POJ 1724

来源:互联网 发布:淘宝网童装男童秋装 编辑:程序博客网 时间:2024/06/16 05:06

直接DFS+减枝

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;


struct Edge
{
    int to;
    int w;
    int money;
    int next;
}edge[10005];


int k,n,r,num;
int head[105];
bool visit[105];
int MINLEN = 0x7fffffff;


void DFS(int start,int len,int mon)
{
    if(len>=MINLEN||mon>k)
        return;
    visit[start] = true;
    if(start==n)
        {
            if(len<MINLEN&&mon<=k)
            {
                MINLEN = len;
            }
            return;
        }
    for(int i = head[start];i!=0;i=edge[i].next)
    {
        if(visit[edge[i].to]==false)
            {
                DFS(edge[i].to,len+edge[i].w,mon+edge[i].money);
                visit[edge[i].to] = false;
            }
    }
}


int main()
{
    int u,v,w,c;
    while(scanf("%d",&k)!=EOF)
    {
        num = 0;
        MINLEN = 0x7fffffff;
        for(int i = 0;i<105;i++)
        {
            visit[i] = false;
            head[i] = 0;
        }
        scanf("%d %d",&n,&r);
        for(int i = 1;i<=r;i++)
        {
            scanf("%d %d %d %d",&u,&v,&w,&c);
            edge[i].to = v;
            edge[i].w = w;
            edge[i].money= c;
            edge[i].next = head[u];
            head[u] = i;
        }
        DFS(1,0,0);
        if(MINLEN == 0x7fffffff)
            MINLEN = -1;
        printf("%d\n",MINLEN);
    }
    return 0;
}

原创粉丝点击