POJ 3411 Paid Roads(DFS)
2013-07-06 15:31
477 查看
题目链接
点和边 都很少,确定一个界限,爆搜即可。判断点到达注意一下,如果之前已经到了,就不用回溯了,如果之前没到过,要回溯。
点和边 都很少,确定一个界限,爆搜即可。判断点到达注意一下,如果之前已经到了,就不用回溯了,如果之前没到过,要回溯。
#include <cstring> #include <cstdio> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; struct node { int a,b,c,p,r,next; } edge[101]; int first[21],t,minz; int o[21],n; void CL() { t = 1; memset(first,-1,sizeof(first)); memset(o,0,sizeof(o)); } void add(int a,int b,int c,int p,int r) { edge[t].a = a; edge[t].b = b; edge[t].c = c; edge[t].p = p; edge[t].r = r; edge[t].next = first[a]; first[a] = t ++; } void dfs(int x,int sum) { int i,v,s,z; if(sum >= minz) return ; if(x == n) { minz = min(sum,minz); return ; } for(i = first[x]; i != -1; i = edge[i].next) { v = edge[i].b; s = edge[i].c; z = 0; if(o[s]) { if(o[v]) z = 1; else o[v] = 1; dfs(v,sum+edge[i].p); if(z == 0) o[v] = 0; } else { if(o[v]) z = 1; else o[v] = 1; dfs(v,sum+edge[i].r); if(z == 0) o[v] = 0; } } return ; } int main() { int i,m,sum; int a,b,c,p,r; scanf("%d%d",&n,&m); CL(); sum = 0; for(i = 1; i <= m; i ++) { scanf("%d%d%d%d%d",&a,&b,&c,&p,&r); add(a,b,c,p,r); sum += r; } minz = sum+1; o[1] = 1; dfs(1,0); if(minz == sum+1) printf("impossible\n"); else printf("%d\n",minz); return 0; }
相关文章推荐
- 多次访问节点的DFS POJ 3411 Paid Roads
- POJ 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads(dfs技巧)
- poj 3411 Paid Roads -dfs
- poj 3411 Paid Roads 简单的dfs
- poj 3411 Paid Roads(dfs)
- poj 3411 Paid Roads(DFS)
- POJ 3411 Paid Roads(DFS)
- Poj 3411 Paid Roads (DFS 特殊标记方法)
- poj 3411 Paid Roads(dfs)
- POJ 3411 Paid Roads(SPFA || DFS)
- POJ 3411 Paid Roads(dfs)
- poj 3411 Paid Roads (dfs)
- POJ 3411 Paid Roads 简单DFS
- POJ 3411 Paid Roads (DFS多次访问节点)
- poj_3411 Paid Roads(dfs技巧)
- poj 3411 Paid Roads(dfs,可重复访问节点)
- POJ 3411-Paid Roads(DFS)
- POJ 3411 Paid Roads(DFS)
- poj 3411 Paid Roads(dfs)