Bessie 和她的姐姐Elsie 想从谷仓走到她们最喜爱的牧场。她们在同一时间离开谷仓,也在同一时间到达最喜爱的牧场。
整个农场有N (1≤N≤16) 个牧场,1 号牧场就是谷仓,N 号牧场是她们最喜爱的牧场。
整个农场是建在一个山坡上的;如果X<Y,则代表X 号牧场比Y 牧场要高。有M条路径连接一堆牧场。然而,由于每条路径都很陡,每条路只能向下山的方向走。比如,一条连接5 和8 农场的路只能从5走到8 而不能反过来,因为那样就是向山上走了。每对牧场之间最多有一条路径,故M≤N(N−1)/2。
Bessie 和Elsie 可能需要不同的时间来走过一条路径;例如,Bessie 可能花10 个单位的时间,而Elsie 会花20 个单位。而且她们只在路径上花时间;她们不会在牧场游荡,所以在牧场上是不花时间的。
请帮助决定Bessie 和Elsie 至少要花多少时间使她们能在同时到达她们最喜爱的农场。
Input
第一行两个整数N 和M,用空格分开。
接下来M 行每行有四个整数A,B,C,D;表示A 牧场和B 牧场是被连接的,C 是Bessie 经过这条路要花的时间,D 是Elsie 经过这条路要花的时间。C 和D 的范围是1…1000。
Output
一个整数,Bessie 和Elsie 至少要花多少时间使她们能在同时到达她们最喜爱的农场。如果这是不可能的,或者根本就没有路径使她们能到达她们最喜爱的农场,则输出IMPOSSIBLE。
Samples
Input Copy
3 3
1 3 1 2
1 2 1 2
2 3 1 2
Output
2
Hint
【样例解释】
Bessie 在每条路径上都比Elsie 快一倍;但是如果Bessie 采用路径1->2->3,Elsie 采用路径1->3那么她们将在同一时间到达
【数据规模】
对于20% 的数据,满足:N≤5;
对于100% 的数据,满足:N≤16。
Source
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
ll read(){
ll res = 0, ch, flag = 0;if((ch = getchar()) == '-')flag = 1;else if(ch >= '0' && ch <= '9')res = ch - '0';while((ch = getchar()) >= '0' && ch <= '9' )res = res * 10 + ch - '0';return flag ? -res : res;}
const int maxn =1e6+199 ;
ll sum=0,maxa=-1;
ll n,m,k,w,ans=0,cnt=0;
ll a[2][maxn]; //a[0][0]其实代表第一条路线的时间 a[0][1]代表第二条路线的时间(拿第一个人说)
ll b[2];
ll dis[2][20][20];
ll mod=1000000007;
map<int,int>mp;
void dfs(int t,int str,int end,int jin)
{
if(str==end) a[t][b[t]++]=jin;
else{
for(int i=str+1;i<=n;i++)
if(dis[t][str][i])
dfs(t,i,n,jin+dis[t][str][i]);
}
}
int main()
{
n=read();
m=read();
for(int i=1;i<=m;i++)
{
int x,y;
x=read(); y=read();
if(x>y)
swap(x,y);
int xx,yy;
xx=read(); yy=read();
///单向边 赋 权值
dis[0][x][y]=xx;
dis[1][x][y]=yy;
}
dfs(0,1,n,0);
dfs(1,1,n,0);
sort(a[0],a[0]+b[0]);
sort(a[1],a[1]+b[1]);
for(int i=0;i<=b[0];i++)
{
for(int j=0;j<=b[1]&&a[1][j]<=a[0][i];j++) //优化
{
if(a[0][i]==a[1][j])
{
cout<<a[0][i];
return 0;
}
}
}
cout<<"IMPOSSIBLE";
return 0;
}