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; }