3411Paid Roads

看了人家的代码才知道的

不知道为什么?就是每个城市最多经过4次(网上说的“闸数”)就可以跳出循环了————这个是人家说的,我也不懂

仔细想了想,难道是因为超过4次的话,他就有可能超时,这样解释的话,不是大家在钻空子吗???

#include "iostream"
#include "string.h"
using namespace std;

struct{
  int b,c,p,r,pre;
}edge[120];
int next[120],f[120],m,n,MIN,num;

void add(int a,int b,int c,int p,int r){
  edge[num].b=b;
  edge[num].c=c;
  edge[num].p=p;
  edge[num].r=r;
  edge[num].pre=next[a];
  next[a]=num++;
}

void dfs(int x,int sum){
  int flag=0,i;
  if(f[x]==4)return;
  if(x==n){
    if(sum<MIN)MIN=sum;
    return;
  }
  for(i=next[x];i!=-1;i=edge[i].pre){
      //cout<<x<<' '<<edge[i].b<<endl;
      f[edge[i].b]++;
      if(f[edge[i].c]!=0){
        dfs(edge[i].b,sum+edge[i].p);
      }
      else {
        dfs(edge[i].b,sum+edge[i].r);
      }
      f[edge[i].b]--;
    }
}

int main(){
  int i,a,b,c,d,p,r;
  cin>>n>>m;
  memset(next,-1,sizeof(next));
  memset(f,0,sizeof(f));
  for(i=1;i<=m;i++){
    cin>>a>>b>>c>>p>>r;
    add(a,b,c,p,r);
  }
  f[1]=1;
  MIN=100000;
  num=0;
  dfs(1,0);
  if(MIN==100000)cout<<"impossible"<<endl;
  else cout<<MIN<<endl;
}

 

 

posted @ 2013-10-11 19:38  龙城星  阅读(218)  评论(0编辑  收藏  举报