POJ-3411-Paid Roads

来源:互联网 发布:淘宝宝贝涨价被降权了 编辑:程序博客网 时间:2024/06/03 20:16

dfs,用邻接表,有重边

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>#include <map>#include <cmath>#include <stdlib.h>using namespace std;const double PI = acos(-1.0);const double eps = 1e-8;const int MAX = 1e1+10;const int mod = 1e9+7;int a, b, c, p, r, n, m, ans, vis[11], top;struct edge{    int p, r, b, next, c;}lxt[MAX];int adj[MAX];void add(int a, int b, int c, int p, int r){    lxt[top].b = b;    lxt[top].c = c;    lxt[top].p = p;    lxt[top].r = r;    lxt[top].next = adj[a];    adj[a] = top++;}void dfs(int pre, int cost){    if(pre==n)    {        ans = min(ans, cost);        return;    }    if(cost>=ans)return;    for(int i = adj[pre]; i!=-1; i=lxt[i].next)    {          c = lxt[i].c;          p = lxt[i].p;          r = lxt[i].r;          int b = lxt[i].b;//迷之bug,必须定义成局部,不然会wa        if(vis[b]<=3)        {            vis[b]++;            if(vis[c]>0)dfs(b,cost+p);            else dfs(b,cost+r);            vis[b]--;        }    }}int main(){   cin>>n>>m;   top = 0;   ans = mod;   memset(vis, 0, sizeof(vis));   memset(adj, -1, sizeof(adj));   while(m--)   {       cin>>a>>b>>c>>p>>r;       add(a,b,c,p,r);   }   vis[1] = 1;   dfs(1, 0);   if(ans!=mod)cout<<ans<<endl;   else cout<<"impossible"<<endl;    return 0;}


0 0