POJ 3411

来源:互联网 发布:官方软件 编辑:程序博客网 时间:2024/06/06 01:22

我感觉DFS就是两个方面 一个是剪枝 另一个就是DFS的路径标记问题:首先这道题目有可能一条路不止走一次 多以不可以标记路,但是有不得不标记,要是不标记就无限循环了,所以我们考虑用一个数组计算在某一种走法下路过城市的次数,我是这样想的:因为m<=10,及某个点为中心画环(至少3个元素,应为两个元素的没有必要考虑)最多在画4个环(其他的点最多出现在一个环中间)当然话的时候请带箭头从1指到10,所以这个访问次数就却定最多为4,以下是代码:

#include<iostream>#include<string.h>#define INF 100000int v[11],n,m,minpay;struct{    int a,b,c,p,r;}road[11];using namespace std;void dfs(int city,int sum){    //cout<<sum<<endl;    if(city==n){        if(minpay>sum) minpay=sum;        return;    }    for(int j=1;j<=m;j++){        if(road[j].a==city/*&&v[road[j].a]<3*/&&v[road[j].b]<=4){            v[road[j].b]++;            if(v[road[j].c]>=1){               // cout<<"j="<<j<<endl;                dfs(road[j].b,sum+road[j].p);            }            else {                //cout<<"j="<<j<<endl;                dfs(road[j].b,sum+road[j].r);            }            v[road[j].b]--;        }    }    return ;}int main(){    while(cin>>n>>m){        for(int i=1;i<=m;i++) cin>>road[i].a>>road[i].b>>road[i].c>>road[i].p>>road[i].r;         memset(v,0,sizeof(v));         v[1]=1;         minpay=INF;        dfs(1,0);        if(minpay==INF)        cout<<"impossible"<<endl;        else        cout<<minpay<<endl;    }    return 0;}


0 0