汇合 绘图

2 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛郎恋刘娘,刘娘念牛郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值