#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int INF=100000000;
int n,m,d[1500][20];
struct edge
{
int to,p,r,c;
};
struct state
{
int cost,s,v;
state(int cost,int s,int v):cost(cost),s(s),v(v)
{}
bool operator >(const state &s)const
{
return cost >s.cost;
}
};
vector<edge> g[20];
int main()
{
scanf("%d%d",&n,&m);
edge e;
int a,t;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d%d",&a,&e.to,&e.c,&e.p,&e.r);
g[a].push_back(e);
}
priority_queue<state,vector<state>,greater<state> > que;
for(int i=0;i<1500;i++)
fill(d[i],d[i]+20,INF);
d[1][1]=0;
que.push(state(0,1,1));
while(!que.empty())
{
state p=que.top();
que.pop();
int v=p.v;
if(d[p.s][v]<p.cost)
continue;
for(int i=0;i<g[v].size();i++)
{
edge &e=g[v][i];
int cost;
if((1<<(e.c-1))&p.s)
cost=min(e.r,e.p);
else
cost=e.r;
if(d[p.s|(1<<(e.to-1))][e.to]>d[p.s][v]+cost)
{
d[p.s|(1<<(e.to-1))][e.to]=d[p.s][v]+cost;
que.push((state){d[p.s|(1<<(e.to-1))][e.to],p.s|(1<<(e.to-1)),e.to});
}
}
}
int ans =INF;
for(int i=1;i<1<<n;i++)
ans=min(ans,d[i][n]);
if(ans==INF)
printf("impossible\n");
else
printf("%d\n",ans);
return 0;
}
本題我使用的是dijistra,WA了兩次
一次因爲沒有判斷是否可能的情況
還有一次害我好了好幾小時,最後在發現道路是單向的,瞬間感覺到出題者滿滿的惡意
代碼有點囉嗦,我也懶得改了