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

poj 3411 Paid Roads (dfs)

2014-07-25 20:07 543 查看
题目链接

题意:有N个城市被M条道路连接起来了,每两个城市之间可能存在超过一条路,但是城市之间是单向连接的。

每条路是要花费的。每条路的花费可以选择两种方式:1:假如a城市到达b城市,如果之前经过了c城市,那么这条

路上的花费为P也可以为R。2:如果没有经过c,则这条路上的花费为R。问从城市1到城市n最小的花费是多少.

思路:存在走多次边的情况,所以vis[]数组可以多次,但是这个题目的多次的上限为3(不知道为什么)。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#define LL long long
using namespace std;
const int maxn = 20+10;
const int INF = 1<<28;
int n, m, vis[maxn], ans;
struct node
{
int b, c, p, r;
}tmp;
vector<node>v[maxn];

void dfs(int x, int cost)
{
vis[x] ++;
if(cost >= ans) return;
if(x == n)
{
ans = cost;
return;
}
int t, b1;
for(int i = 0; i < v[x].size(); i++)
{
b1 = v[x][i].b;
if(vis[b1]<=3)
{
t = INF;
if(vis[v[x][i].c])
t = v[x][i].p;
if(t > v[x][i].r)
t = v[x][i].r;
dfs(b1, cost+t);
vis[b1] --;
}
}
}
int main()
{
int i;
int a1, b1, c1, p1, r1;
while(~scanf("%d%d", &n, &m))
{
ans = INF;
memset(vis, 0, sizeof(vis));
for(i = 0; i < m; i++)
{
cin>>a1>>b1>>c1>>p1>>r1;
tmp.b = b1; tmp.c = c1;
tmp.p = p1; tmp.r = r1;
v[a1].push_back(tmp);
}
dfs(1, 0);
if(ans == INF) cout<<"impossible"<<endl;
else cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: