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

poj 3411 Paid Roads很水的DFS

2013-08-16 16:10 387 查看
题意:给你N  城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少。

直接DFS搜。

链接http://poj.org/problem?id=3411

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define loop(s,i,n) for(i = s;i < n;i++)
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn = 521;
const int inf = 99999999;
using namespace std;
struct node
{
int u,v,c,r,p;
};
vector <struct node >g[15];
int vis[15];
int ans;
int n,m;
void dfs(int u,int val)
{
vis[u]++;
if(u == n)
{
if(ans > val)
ans = val;
return ;
}

if(ans < val)
return;

int i;

for(i = 0;i < g[u].size();i++)
{
int v;
v = g[u][i].v;
int c;
c = g[u][i].c;
if(vis[v] <= 3)
{
int min;
min = inf;
if(vis[c] && min > g[u][i].p)
min = g[u][i].p;
if(min > g[u][i].r)
min = g[u][i].r;

dfs(v,val+min);
vis[v]--;
}
}

}

int main()
{
int u,v,t,p,r;
while(~scanf("%d %d",&n,&m))
{
int i,j;
memset(vis,0,sizeof(vis));
for(i = 1;i <= n;i++)
g[i].clear();

while(m--)
{
scanf("%d%d%d%d%d",&u,&v,&t,&p,&r);
g[u].push_back((struct node){u,v,t,r,p});
}
ans = inf;
dfs(1,0);
if(ans != inf)
cout<<ans<<endl;
else
puts("impossible");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: