11月22日训练题解

题目链接:https://atcoder.jp/contests/abc228/tasks

abc228_a

题意:高桥每天在S点(24小时制)打开他的房间的灯,并在T点关闭。灯亮时日期可能会改变。确定灯是否在X点后30分钟亮起。

题解:按题目叙述模拟即可 (说句实话细节比较多 直接看代码吧)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#include <fstream>
#include <climits>

using namespace std;
typedef long long ll;

#define pi acos(-1.0)

#define oula                                                              \
    bool notprime[1000010];                                               \
    int primes[1000010];                                                  \
    void get_prime()                                                      \
    {                                                                     \
        notprime[1] = true;                                               \
        for (int i = 2; i < 1000010; ++i)                                 \
            if (!notprime[i])                                             \
            {                                                             \
                primes[++primes[0]] = i;                                  \
                for (long long j = (long long)i * i; j < 1000010; j += i) \
                    notprime[j] = true;                                   \
            }                                                             \
    };

#define ksm                           \
    inline ll qpow(ll x, ll a)        \
    {                                 \
        ll ret = 1, k = x;            \
        for (; a; a >>= 1, k = k * k) \
            if (a & 1)                \
                ret = ret * k;        \
        return ret;                   \
    }

#define gcdxy                     \
    ll gcd(ll a, ll b)            \
    {                             \
        if (a < b)                \
            swap(a, b);           \
        if (b == 0)               \
            return a;             \
        else                      \
            return gcd(a % b, b); \
    }

#define fread                           \
    inline ll read()                    \
    {                                   \
        char ch = getchar();            \
        ll x = 0, f = 1;                \
        while (ch < '0' || ch > '9')    \
        {                               \
            if (ch == ' - ')            \
                f = -1;                 \
            ch = getchar();             \
        }                               \
        while ('0' <= ch && ch <= '9')  \
        {                               \
            x = x * 10 + int(ch - '0'); \
            ch = getchar();             \
        }                               \
        return x * f;                   \
    }

#define xor_                    \
    ll xor_n(ll n)              \
    {                           \
        ll t = n & 3;           \
        if (t & 1)              \
            return t / 2ll ^ 1; \
        return t / 2ll ^ n;     \
    }

#define exgcd_                         \
    ll exgcd(ll a, ll b, ll &x, ll &y) \
    {                                  \
        if (b == 0)                    \
        {                              \
            x = 1;                     \
            y = 0;                     \
            return a;                  \
        }                              \
        ll r = exgcd(b, a % b, x, y);  \
        ll t = x;                      \
        x = y;                         \
        y = t - a / b * y;             \
        return r;                      \
    }
#define mksm                                \
    int mod = 1e9 + 7;                      \
    inline ll mqpow(ll x, ll a)             \
    {                                       \
        ll ret = 1, k = x;                  \
        for (; a; a >>= 1, k = k * k % mod) \
            if (a & 1)                      \
                ret = ret * k % mod;        \
        return ret;                         \
    }

void exgcd_e(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
        y = 0;
    }
    else
    {
        exgcd_e(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}

//oula
ksm gcdxy fread xor_ exgcd_ mksm

ll dp[1100];

int main(void) {
    // ifstream cin;
    // fstream cout;
    // cin.open("input.txt", ios::in);
    // cout.open("ans.txt", ios::out);
    int n,k,x;
    cin >> n >> k >> x;
    if(n > k)
        k += 24;
    if(x < n)
        x += 24;
    if(n <= x && k > x)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    return 0;
}

/*

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

-1 1  4  0 -5  1  8 0 -9 1  12  0
1  2  3  4  5  6  7 8 9  10 11 12

3 1 -2 2
1 2  3 4

2 0 -3 1  6 0 -7 1
1 2 3  4  5 6 7 8

3 2 -4 -2 0
7 6 2 4

5 4 2
*/

abc228_b

题意:高桥有N个朋友。有一天,高桥不小心让他的一个朋友,朋友X知道了他可耻的秘密。

对于每个i=1,2,…,N,当朋友第i知道秘密时,他/她将与朋友Ai分享​, 如果朋友 Ai​ 不知道这个秘密。

有多少高桥的朋友最终会知道这个秘密?

题解:说句实话这个题我一开始读假了,就是翻译没清楚,但是翻译过来之后发现,对于X开始寻找找到一个已经告诉过的人停止即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#include <fstream>
#include <climits>

using namespace std;
typedef long long ll;

#define pi acos(-1.0)

#define oula                                                              \
    bool notprime[1000010];                                               \
    int primes[1000010];                                                  \
    void get_prime()                                                      \
    {                                                                     \
        notprime[1] = true;                                               \
        for (int i = 2; i < 1000010; ++i)                                 \
            if (!notprime[i])                                             \
            {                                                             \
                primes[++primes[0]] = i;                                  \
                for (long long j = (long long)i * i; j < 1000010; j += i) \
                    notprime[j] = true;                                   \
            }                                                             \
    };

#define ksm                           \
    inline ll qpow(ll x, ll a)        \
    {                                 \
        ll ret = 1, k = x;            \
        for (; a; a >>= 1, k = k * k) \
            if (a & 1)                \
                ret = ret * k;        \
        return ret;                   \
    }

#define gcdxy                     \
    ll gcd(ll a, ll b)            \
    {                             \
        if (a < b)                \
            swap(a, b);           \
        if (b == 0)               \
            return a;             \
        else                      \
            return gcd(a % b, b); \
    }

#define fread                           \
    inline ll read()                    \
    {                                   \
        char ch = getchar();            \
        ll x = 0, f = 1;                \
        while (ch < '0' || ch > '9')    \
        {                               \
            if (ch == ' - ')            \
                f = -1;                 \
            ch = getchar();             \
        }                               \
        while ('0' <= ch && ch <= '9')  \
        {                               \
            x = x * 10 + int(ch - '0'); \
            ch = getchar();             \
        }                               \
        return x * f;                   \
    }

#define xor_                    \
    ll xor_n(ll n)              \
    {                           \
        ll t = n & 3;           \
        if (t & 1)              \
            return t / 2ll ^ 1; \
        return t / 2ll ^ n;     \
    }

#define exgcd_                         \
    ll exgcd(ll a, ll b, ll &x, ll &y) \
    {                                  \
        if (b == 0)                    \
        {                              \
            x = 1;                     \
            y = 0;                     \
            return a;                  \
        }                              \
        ll r = exgcd(b, a % b, x, y);  \
        ll t = x;                      \
        x = y;                         \
        y = t - a / b * y;             \
        return r;                      \
    }
#define mksm                                \
    int mod = 1e9 + 7;                      \
    inline ll mqpow(ll x, ll a)             \
    {                                       \
        ll ret = 1, k = x;                  \
        for (; a; a >>= 1, k = k * k % mod) \
            if (a & 1)                      \
                ret = ret * k % mod;        \
        return ret;                         \
    }

void exgcd_e(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
        y = 0;
    }
    else
    {
        exgcd_e(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}

//oula
ksm gcdxy fread xor_ exgcd_ mksm

int a[1000010];
int pos[1000010];

int main(void) {
    // ifstream cin;
    // fstream cout;
    // cin.open("input.txt", ios::in);
    // cout.open("ans.txt", ios::out);
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int ans = 0;
    while(!pos[k])
    {
        pos[k] = 1;
        k = a[k];
        ans++;
    }
    cout << ans << endl;
    return 0;
}

/*

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

-1 1  4  0 -5  1  8 0 -9 1  12  0
1  2  3  4  5  6  7 8 9  10 11 12

3 1 -2 2
1 2  3 4

2 0 -3 1  6 0 -7 1
1 2 3  4  5 6 7 8

3 2 -4 -2 0
7 6 2 4

5 4 2
*/


abc228_c

题意:N学生参加为期4天的考试。每天有300分的考试,总共1200分。

前三天的考试已经结束,第四天就要开始了。这个第i名学生(1≤i≤N) 有P(i,j​ )为i第j天的积分(1≤j≤3).

对于每个学生,确定他/她是否有可能在第四天之后进入前K名。

在这里,第四天之后的学生排名定义为四天内总分高于该学生的学生人数加1。

题解:这道题可以化简为第分数k大之后的学生加上三百分是否可以大于等于第k大的分数

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#include <fstream>
#include <climits>

using namespace std;
typedef long long ll;

#define pi acos(-1.0)

#define oula                                                              \
    bool notprime[1000010];                                               \
    int primes[1000010];                                                  \
    void get_prime()                                                      \
    {                                                                     \
        notprime[1] = true;                                               \
        for (int i = 2; i < 1000010; ++i)                                 \
            if (!notprime[i])                                             \
            {                                                             \
                primes[++primes[0]] = i;                                  \
                for (long long j = (long long)i * i; j < 1000010; j += i) \
                    notprime[j] = true;                                   \
            }                                                             \
    };

#define ksm                           \
    inline ll qpow(ll x, ll a)        \
    {                                 \
        ll ret = 1, k = x;            \
        for (; a; a >>= 1, k = k * k) \
            if (a & 1)                \
                ret = ret * k;        \
        return ret;                   \
    }

#define gcdxy                     \
    ll gcd(ll a, ll b)            \
    {                             \
        if (a < b)                \
            swap(a, b);           \
        if (b == 0)               \
            return a;             \
        else                      \
            return gcd(a % b, b); \
    }

#define fread                           \
    inline ll read()                    \
    {                                   \
        char ch = getchar();            \
        ll x = 0, f = 1;                \
        while (ch < '0' || ch > '9')    \
        {                               \
            if (ch == ' - ')            \
                f = -1;                 \
            ch = getchar();             \
        }                               \
        while ('0' <= ch && ch <= '9')  \
        {                               \
            x = x * 10 + int(ch - '0'); \
            ch = getchar();             \
        }                               \
        return x * f;                   \
    }

#define xor_                    \
    ll xor_n(ll n)              \
    {                           \
        ll t = n & 3;           \
        if (t & 1)              \
            return t / 2ll ^ 1; \
        return t / 2ll ^ n;     \
    }

#define exgcd_                         \
    ll exgcd(ll a, ll b, ll &x, ll &y) \
    {                                  \
        if (b == 0)                    \
        {                              \
            x = 1;                     \
            y = 0;                     \
            return a;                  \
        }                              \
        ll r = exgcd(b, a % b, x, y);  \
        ll t = x;                      \
        x = y;                         \
        y = t - a / b * y;             \
        return r;                      \
    }
#define mksm                                \
    int mod = 1e9 + 7;                      \
    inline ll mqpow(ll x, ll a)             \
    {                                       \
        ll ret = 1, k = x;                  \
        for (; a; a >>= 1, k = k * k % mod) \
            if (a & 1)                      \
                ret = ret * k % mod;        \
        return ret;                         \
    }

void exgcd_e(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
        y = 0;
    }
    else
    {
        exgcd_e(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}

//oula
ksm gcdxy fread xor_ exgcd_ mksm


int main(void) {
    // ifstream cin;
    // fstream cout;
    // cin.open("input.txt", ios::in);
    // cout.open("ans.txt", ios::out);
    int n, k;
    cin >> n >> k;
    vector<int> a;
    vector<int> b;
    for(int i = 0; i < n ; i++)
    {
        int x,y,z;
        cin >> x >> y >> z;
        a.push_back(x+y+z);
    }
    b = a;
    sort(a.begin(),a.end(), greater<int>());
    for(int i = 0; i < n ; i++)
    {
        if(a[k-1]-300 > b[i])
            cout << "No" << endl;
        else
            cout << "Yes" << endl;
    }
}

/*

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

-1 1  4  0 -5  1  8 0 -9 1  12  0
1  2  3  4  5  6  7 8 9  10 11 12

3 1 -2 2
1 2  3 4

2 0 -3 1  6 0 -7 1
1 2 3  4  5 6 7 8

3 2 -4 -2 0
7 6 2 4

5 4 2
*/

题目链接:https://atcoder.jp/contests/arc129/tasks

arc129_a

题意:给定的是整数N、L和R。计算满足以下两个条件的整数x的数量。
L≤x≤R
(x⊕N)<N 其中的⊕为按位XOR。

题解:(我先抱怨一下我自己,因为自己犯病了,没去想到l和r在同一个2的n次方区间然后影响了这场比赛,比赛直接爆零。)本题直接枚举每个二的n次方,判断l之前有多少个数和n异或比n小和r之前有多少个数和n异或比n小,最后r区间减去l区间即可,算的时候要注意一下不能暴力枚举,
如果去手写几个样例可以想到一个规律n的r位二进制为1时,在r位之前的所有数都可以异或比n小。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#include <fstream>
#include <climits>

using namespace std;
typedef long long ll;

#define pi acos(-1.0)

#define oula                                                              \
    bool notprime[1000010];                                               \
    int primes[1000010];                                                  \
    void get_prime()                                                      \
    {                                                                     \
        notprime[1] = true;                                               \
        for (int i = 2; i < 1000010; ++i)                                 \
            if (!notprime[i])                                             \
            {                                                             \
                primes[++primes[0]] = i;                                  \
                for (long long j = (long long)i * i; j < 1000010; j += i) \
                    notprime[j] = true;                                   \
            }                                                             \
    };

#define ksm                           \
    inline ll qpow(ll x, ll a)        \
    {                                 \
        ll ret = 1, k = x;            \
        for (; a; a >>= 1, k = k * k) \
            if (a & 1)                \
                ret = ret * k;        \
        return ret;                   \
    }

#define gcdxy                     \
    ll gcd(ll a, ll b)            \
    {                             \
        if (a < b)                \
            swap(a, b);           \
        if (b == 0)               \
            return a;             \
        else                      \
            return gcd(a % b, b); \
    }

#define fread                           \
    inline ll read()                    \
    {                                   \
        char ch = getchar();            \
        ll x = 0, f = 1;                \
        while (ch < '0' || ch > '9')    \
        {                               \
            if (ch == ' - ')            \
                f = -1;                 \
            ch = getchar();             \
        }                               \
        while ('0' <= ch && ch <= '9')  \
        {                               \
            x = x * 10 + int(ch - '0'); \
            ch = getchar();             \
        }                               \
        return x * f;                   \
    }

#define xor_                    \
    ll xor_n(ll n)              \
    {                           \
        ll t = n & 3;           \
        if (t & 1)              \
            return t / 2ll ^ 1; \
        return t / 2ll ^ n;     \
    }

#define exgcd_                         \
    ll exgcd(ll a, ll b, ll &x, ll &y) \
    {                                  \
        if (b == 0)                    \
        {                              \
            x = 1;                     \
            y = 0;                     \
            return a;                  \
        }                              \
        ll r = exgcd(b, a % b, x, y);  \
        ll t = x;                      \
        x = y;                         \
        y = t - a / b * y;             \
        return r;                      \
    }
#define mksm                                \
    int mod = 1e9 + 7;                      \
    inline ll mqpow(ll x, ll a)             \
    {                                       \
        ll ret = 1, k = x;                  \
        for (; a; a >>= 1, k = k * k % mod) \
            if (a & 1)                      \
                ret = ret * k % mod;        \
        return ret;                         \
    }

void exgcd_e(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
        y = 0;
    }
    else
    {
        exgcd_e(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}

//oula
ksm gcdxy fread xor_ exgcd_ mksm

ll a[100];

int main(void) {
    // ifstream cin;
    // fstream cout;
    // cin.open("input.txt", ios::in);
    // cout.open("ans.txt", ios::out);
    for(ll i = 0; i < 63 ;i++)
    {
        a[i] = 1ll << i;
    }
    ll n,l,r;
    cin >> n >> l >> r;
    ll ans1 = 0;
    ll ans2 = 0;
    l --;
    for(ll i = 0; i < 63 ; i++)
    {
        if((n ^ a[i]) < n && l >= a[i])
        {
            if(l > a[i + 1])
            ans1 += a[i];
            else
                ans1 += l % a[i] + 1;
        }

         //cout << ans <<" " << a[i] <<  endl;
    }
    for(ll i = 0; i < 63 ; i++)
    {
        if((n ^ a[i]) < n && r >= a[i])
        {
            if(r > a[i + 1])
                ans2 += a[i];
            else
                ans2 += r % a[i] + 1;
        }

        //cout << ans <<" " << a[i] <<  endl;
    }
    // cout << ans << endl;
    cout << ans2 - ans1 <<endl;
    return 0;
}

/*

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

-1 1  4  0 -5  1  8 0 -9 1  12  0
1  2  3  4  5  6  7 8 9  10 11 12

3 1 -2 2
1 2  3 4

2 0 -3 1  6 0 -7 1
1 2 3  4  5 6 7 8

3 2 -4 -2 0
7 6 2 4

5 4 2
*/

arc129_b

题意:对于整数l、r和x(l≤r) ,让我们定义dist(l,r,x)如下。
如果 x < l: dist(l,r,x) = l−x
如果 l ≤ x ≤ r: dist(l,r,x) = 0
如果 r < x: dist(l,r,x) = x − r
给定N对整数,其第i个为(Li,Ri​). 每个k=1,2,⋯,N、 解决以下问题。让我们自由选择一个整数x并计算max(dist(L1​,R1​,x) ,dist(L2​,R2​,x) ,,⋯,区(Lk​,Rk​,x) )。请找到此值的最小可能值。

题解: 对于每一次都找到他当前最大的左区间和最小的右区间即可,因为 如果lmax<rmin的时候,可以让这个数放在一个l和一个r之间 结果为0
其他的情况就是取两个数中点的向上取整最小

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cmath>
#include <fstream>
#include <climits>

using namespace std;
typedef long long ll;

#define pi acos(-1.0)

#define oula                                                              \
    bool notprime[1000010];                                               \
    int primes[1000010];                                                  \
    void get_prime()                                                      \
    {                                                                     \
        notprime[1] = true;                                               \
        for (int i = 2; i < 1000010; ++i)                                 \
            if (!notprime[i])                                             \
            {                                                             \
                primes[++primes[0]] = i;                                  \
                for (long long j = (long long)i * i; j < 1000010; j += i) \
                    notprime[j] = true;                                   \
            }                                                             \
    };

#define ksm                           \
    inline ll qpow(ll x, ll a)        \
    {                                 \
        ll ret = 1, k = x;            \
        for (; a; a >>= 1, k = k * k) \
            if (a & 1)                \
                ret = ret * k;        \
        return ret;                   \
    }

#define gcdxy                     \
    ll gcd(ll a, ll b)            \
    {                             \
        if (a < b)                \
            swap(a, b);           \
        if (b == 0)               \
            return a;             \
        else                      \
            return gcd(a % b, b); \
    }

#define fread                           \
    inline ll read()                    \
    {                                   \
        char ch = getchar();            \
        ll x = 0, f = 1;                \
        while (ch < '0' || ch > '9')    \
        {                               \
            if (ch == ' - ')            \
                f = -1;                 \
            ch = getchar();             \
        }                               \
        while ('0' <= ch && ch <= '9')  \
        {                               \
            x = x * 10 + int(ch - '0'); \
            ch = getchar();             \
        }                               \
        return x * f;                   \
    }

#define xor_                    \
    ll xor_n(ll n)              \
    {                           \
        ll t = n & 3;           \
        if (t & 1)              \
            return t / 2ll ^ 1; \
        return t / 2ll ^ n;     \
    }

#define exgcd_                         \
    ll exgcd(ll a, ll b, ll &x, ll &y) \
    {                                  \
        if (b == 0)                    \
        {                              \
            x = 1;                     \
            y = 0;                     \
            return a;                  \
        }                              \
        ll r = exgcd(b, a % b, x, y);  \
        ll t = x;                      \
        x = y;                         \
        y = t - a / b * y;             \
        return r;                      \
    }
#define mksm                                \
    int mod = 1e9 + 7;                      \
    inline ll mqpow(ll x, ll a)             \
    {                                       \
        ll ret = 1, k = x;                  \
        for (; a; a >>= 1, k = k * k % mod) \
            if (a & 1)                      \
                ret = ret * k % mod;        \
        return ret;                         \
    }

void exgcd_e(ll a, ll b, ll &d, ll &x, ll &y)
{
    if (!b)
    {
        d = a;
        x = 1;
        y = 0;
    }
    else
    {
        exgcd_e(b, a % b, d, y, x);
        y -= x * (a / b);
    }
}

//oula
ksm gcdxy fread xor_ exgcd_ mksm

ll a[100];

int main(void) {
    // ifstream cin;
    // fstream cout;
    // cin.open("input.txt", ios::in);
    // cout.open("ans.txt", ios::out);
    int q;
    cin >> q;
    int maxl = 0,minr = INT_MAX;
    while(q--)
    {
        int l, r;
        cin >> l >> r;
        maxl = max(maxl, l);
        minr = min(minr, r);
        if(maxl < minr)
            cout << 0 << endl;
        else
            cout << (maxl - minr - 1) / 2 + 1 << endl;
    }
    return 0;
}

/*

4
3
1 3 4
5
1 2 5 7 4
1
1
3
69 6969 696969

-1 1  4  0 -5  1  8 0 -9 1  12  0
1  2  3  4  5  6  7 8 9  10 11 12

3 1 -2 2
1 2  3 4

2 0 -3 1  6 0 -7 1
1 2 3  4  5 6 7 8

3 2 -4 -2 0
7 6 2 4

5 4 2
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-01
这道题是一道典型的费用限制最短路题目,可以使用 Dijkstra 算法或者 SPFA 算法来解决。 具体思路如下: 1. 首先,我们需要读入输入数据。输入数据中包含了道路的数量、起和终,以及每条道路的起、终、长度和限制费用。 2. 接着,我们需要使用邻接表或邻接矩阵来存储图的信息。对于每条道路,我们可以将其起和终作为一个有向边的起和终,长度作为边权,限制费用作为边权的上界。 3. 然后,我们可以使用 Dijkstra 算法或 SPFA 算法求解从起到终的最短路径。在这个过程中,我们需要记录到每个的最小费用和最小长度,以及更新每条边的最小费用和最小长度。 4. 最后,我们输出从起到终的最短路径长度即可。 需要注意的是,在使用 Dijkstra 算法或 SPFA 算法时,需要对每个的最小费用和最小长度进行松弛操作。具体来说,当我们从一个 u 经过一条边 (u,v) 到达另一个 v 时,如果新的费用和长度比原来的小,则需要更新到达 v 的最小费用和最小长度,并将 v 加入到优先队列(Dijkstra 算法)或队列(SPFA 算法)中。 此外,还需要注意处理边权为 0 或负数的情况,以及处理无法到达终的情况。 代码实现可以参考以下样例代码: ```c++ #include <cstdio> #include <cstring> #include <queue> #include <vector> using namespace std; const int MAXN = 1005, MAXM = 20005, INF = 0x3f3f3f3f; int n, m, s, t, cnt; int head[MAXN], dis[MAXN], vis[MAXN]; struct Edge { int v, w, c, nxt; } e[MAXM]; void addEdge(int u, int v, int w, int c) { e[++cnt].v = v, e[cnt].w = w, e[cnt].c = c, e[cnt].nxt = head[u], head[u] = cnt; } void dijkstra() { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); dis[s] = 0; q.push(make_pair(0, s)); while (!q.empty()) { int u = q.top().second; q.pop(); if (vis[u]) continue; vis[u] = 1; for (int i = head[u]; i != -1; i = e[i].nxt) { int v = e[i].v, w = e[i].w, c = e[i].c; if (dis[u] + w < dis[v] && c >= dis[u] + w) { dis[v] = dis[u] + w; q.push(make_pair(dis[v], v)); } } } } int main() { memset(head, -1, sizeof(head)); scanf("%d %d %d %d", &n, &m, &s, &t); for (int i = 1; i <= m; i++) { int u, v, w, c; scanf("%d %d %d %d", &u, &v, &w, &c); addEdge(u, v, w, c); addEdge(v, u, w, c); } dijkstra(); if (dis[t] == INF) printf("-1\n"); else printf("%d\n", dis[t]); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值