http://www.cnblogs.com/shenben/p/5577665.html
居然可以用dfs做出来。。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iomanip>
#define inf 0x3f3f3f3f
#define INF 1e9
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
const int maxn=15;
int n,m;
int vis[maxn];
int ans;
struct Edge{
int a,b,c,r,p;
}e[maxn*2];
void dfs(int u,int mincost){
if(u==n){
ans=min(ans,mincost);return;
}
for(int i=1;i<=m;++i){
if(e[i].a==u&&vis[e[i].b]<2){//这里就是所谓的阀值吧, 是10的时候就TLE了,7的时候就是79ms
vis[e[i].b]++;//所以设一个不成环的就是3 。。
if(vis[e[i].c]){
dfs(e[i].b,mincost+e[i].p);
}
else{
dfs(e[i].b,mincost+e[i].r);
}
vis[e[i].b]--;
}
}
}
int main(){
while(~sf("%d%d",&n,&m)){
mem(vis,0);
for(int i=1;i<=m;++i){
sf("%d%d%d%d%d",&e[i].a,&e[i].b,&e[i].c,&e[i].p,&e[i].r);
}
ans=INF;
vis[1]++;
dfs(1,0);
if(ans>=INF){
puts("impossible");
}
else{
pf("%d\n",ans);
}
}
}