您的位置:首页 > 大数据 > 人工智能

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: