比赛 |
20150424 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
相遇时间 |
最终得分 |
100 |
用户昵称 |
Chenyao2333 |
运行时间 |
2.992 s |
代码语言 |
C++ |
内存使用 |
10.60 MiB |
提交时间 |
2015-04-24 11:04:31 |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int L_N=100+10;
const int INF=1e9;
struct edge{
int v,ac,bc;
}es[L_N*L_N];
vector<int> G[L_N];
int N,M;
//小a是贝茜,小b是爱丽丝
//f[i][j][k]表示a在i节点,b在j节点,d[a]+d[b]=k,即a比b快k,f[i][j][k]=d[a],的最小值
int f[L_N][L_N][2*L_N];
int set_min(int & a,int b){
if(b<a) a=b;
}
int main(){
freopen("meeting.in","r",stdin);
freopen("meeting.out","w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=M;i++){
int u,v,ac,bc; scanf("%d %d %d %d",&u,&v,&ac,&bc);
es[i]=(edge){v,ac,bc};
G[u].push_back(i);
}
for(int i=0;i<=N;i++) for(int j=0;j<=N;j++) for(int k=0;k<2*L_N;k++) f[i][j][k]=INF;
f[1][1][L_N]=0;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
for(int k=0;k<2*L_N;k++){
if(f[i][j][k]>=INF) continue;
int tk=k-L_N, tf=f[i][j][k];
if(tk>=0){
for(int ei=0;ei<G[i].size();ei++){
edge & e=es[G[i][ei]];
int tmp=tk-e.ac;
set_min(f[e.v][j][tmp+L_N],tf+e.ac);
}
}else{
for(int ei=0;ei<G[j].size();ei++){
edge & e=es[G[j][ei]];
int tmp=tk+e.bc;
set_min(f[i][e.v][tmp+L_N],tf);
}
}
}
}
}
int ans=f[N][N][L_N];
if(ans>=INF) printf("IMPOSSIBLE\n");
else printf("%d\n",ans);
return 0;
}