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