hdu 3411 (DFS+最短路)

来源:互联网 发布:剑三成女捏脸数据 云盘 编辑:程序博客网 时间:2024/05/22 10:26

点击打开链接


分析:

有n个城市,记为1~N,有m个城市,有些路收费,当c路走过时,收费为p,否则为r。

看到题目,我们首先想到先从第一个路开始,然后进行判断c,走过+p,没走过+r。然后进行求最小值

显然是最短路,又因为数据较小可以用DFS

注意这里加一个判定条件,因为每个城市课重复走,限制它的次数。。。

一般每个节点限制走一次是为了在一个环里面出现无限循环。

这里可以限制一定的次数,让它可以成环但有不至于出现无限循环的情况。。



#include"stdio.h"#include"string.h"struct node{int a,b,c,p,r;}A[11];int n,m,ans;int mark[11];int f;void dfs(int i,int w){int j;if(w>=ans||mark[i]>10)return ;if(i==n){if(ans>w)ans=w;f=1;return ;}mark[i]++;for(j=0;j<m;j++){if(A[j].a==i){if(mark[A[j].c])dfs(A[j].b,w+A[j].p);elsedfs(A[j].b,w+A[j].r);}}mark[i]--;}int main(){int i;while(scanf("%d%d",&n,&m)!=-1){for(i=0;i<m;i++)scanf("%d%d%d%d%d",&A[i].a,&A[i].b,&A[i].c,&A[i].p,&A[i].r);f=0;memset(mark,0,sizeof(mark));ans=999999999;dfs(1,0);if(f)printf("%d\n",ans);else printf("impossible\n");}return 0;}


原创粉丝点击