Submission #618651


Source Code Expand

#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <functional>
#include <map>

using namespace std;

//  E[i]: vertexes which can be reased from i
//  W[i]: their weight
template<class T>
vector<T> dijkstra(vector<vector<int>> E, vector<vector<T>> W, int s, T inf)
{
    int n = (int)E.size();
    
    vector<T> D(n, inf);
    typedef pair<T,int> P;
    priority_queue<P,vector<P>,greater<P>> Q;
    
    D[s] = T();
    Q.push(make_pair(D[s], s));

    while (!Q.empty())
    {
        int d = Q.top().first;
        int p = Q.top().second;
        Q.pop();
        if (d > D[p])
            continue;
        for (int i=0; i<(int)E[p].size(); i++)
        {
            int t = E[p][i];
            if (d+W[p][i] < D[t])
                D[t] = d+W[p][i],
                Q.push(make_pair(D[t], t));
        }
    }
    return D;
}

int main()
{
	int N, M, src, dst;
	cin>>N>>M>>src>>dst;
	vector<int> L(M);
	vector<vector<int>> s(M);
	vector<vector<int>> w(M);
	for (int i=0; i<M; i++)
	{
		cin>>L[i];
		s[i] = vector<int>(L[i]);
		for (int j=0; j<L[i]; j++)
			cin>>s[i][j];
		w[i] = vector<int>(L[i]-1);
		for (int j=0; j<L[i]-1; j++)
			cin>>w[i][j];
	}

	vector<vector<int>> E(N);
	vector<vector<int>> W(N);
	for (int i=0; i<M; i++)
	for (int j=0; j<L[i]-1; j++)
	{
		E[s[i][j]].push_back(s[i][j+1]);
		W[s[i][j]].push_back(w[i][j]);
		E[s[i][j+1]].push_back(s[i][j]);
		W[s[i][j+1]].push_back(w[i][j]);
	}

	int inf = 0x40000000;
	vector<int> D2 = dijkstra(E, W, dst, inf);

	vector<vector<pair<int, int>>> V(N);
	for (int i=0; i<M; i++)
	for (int j=0; j<L[i]; j++)
		V[s[i][j]].push_back(make_pair(i, j));

	vector<vector<int>> w0(M), w1(M);
    for (int i=0; i<M; i++)
    {
        w0[i] = w1[i] = vector<int>(L[i]);
        w0[i][0] = 0;
        for (int j=1; j<L[i]; j++)
            w0[i][j] = w0[i][j-1] + w[i][j-1];
        w1[i][L[i]-1] = 0;
        for (int j=L[i]-2; j>=0; j--)
            w1[i][j] = w1[i][j+1] + w[i][j];
    }

	auto solve = [&](int limit)
	{
		vector<int> D1(N, inf);
		typedef pair<int, int> P;
		priority_queue<P,vector<P>,greater<P>> Q;
		D1[src] = 0;
		Q.push(make_pair(0, src));

		while (!Q.empty())
		{
			int d = Q.top().first;
			int p = Q.top().second;
			Q.pop();
			if (d > D1[p])
				continue;
			for (int i=0; i<(int)V[p].size(); i++)
			{
				int a = V[p][i].first;
				int b = V[p][i].second;

				if (0<b &&
					d+w0[a][b]+D2[s[a][0]]<=limit)
				{
					int t = s[a][b-1];
					if (d+w[a][b-1]<D1[t])
						D1[t] = d+w[a][b-1],
						Q.push(make_pair(D1[t], t));
				}
				if (b<L[a]-1 &&
					d+w1[a][b]+D2[s[a][L[a]-1]]<=limit)
				{
					int t = s[a][b+1];
					if (d+w[a][b]<D1[t])
						D1[t] = d+w[a][b],
						Q.push(make_pair(D1[t], t));
				}
			}
		}

		return D1[dst]<=limit;
	};

	int ans = 0;
	for (int b=inf; b>0; b/=2)
		if (!solve(ans+b))
			ans += b;
	cout<<ans+1<<endl;
}

Submission Info

Submission Time
Task C - メンテナンス明け
User kusano
Language C++11 (GCC 4.9.2)
Score 100
Code Size 3018 Byte
Status AC
Exec Time 401 ms
Memory 7592 KB

Judge Result

Set Name Subtask1 Subtask2
Score / Max Score 50 / 50 50 / 50
Status
AC × 52
AC × 6
Set Name Test Cases
Subtask1 small/00_sample00, small/00_sample01, small/00_sample02, small/10_small-0000, small/10_small-0001, small/10_small-0002, small/10_small-0003, small/10_small-0004, small/10_small-0005, small/10_small-0006, small/10_small-0007, small/10_small-0008, small/10_small-0009, small/10_small-0010, small/10_small-0011, small/10_small-0012, small/10_small-0013, small/10_small-0014, small/10_small-0015, small/10_small-0016, small/10_small-0017, small/10_small-0018, small/10_small-0019, small/30_max_small, small/40_simple_0000, small/40_simple_0001, small/40_simple_0002, small/40_simple_0003, small/40_simple_0004, small/40_simple_0005, small/40_simple_0006, small/40_simple_0007, small/40_simple_0008, small/40_simple_0009, small/40_simple_0010, small/40_simple_0011, small/40_simple_0012, small/40_simple_0013, small/40_simple_0014, small/40_simple_0015, small/40_simple_0016, small/40_simple_0017, small/40_simple_0018, small/40_simple_0019, small/90_dijkstra_killer_00, small/90_dijkstra_killer_01, small/91_tayama_killer_00, small/91_tayama_killer_01, small/91_tayama_killer_02, small/91_tayama_killer_03, small/91_tayama_killer_04, small/91_tayama_killer_05
Subtask2 large/20_large-00, large/20_large-01, large/20_large-02, large/20_large-03, large/20_large-04, large/31_max_large
Case Name Status Exec Time Memory
large/20_large-00 AC 360 ms 7460 KB
large/20_large-01 AC 368 ms 7580 KB
large/20_large-02 AC 389 ms 7592 KB
large/20_large-03 AC 386 ms 7584 KB
large/20_large-04 AC 401 ms 7592 KB
large/31_max_large AC 96 ms 6556 KB
small/00_sample00 AC 25 ms 920 KB
small/00_sample01 AC 25 ms 924 KB
small/00_sample02 AC 26 ms 800 KB
small/10_small-0000 AC 29 ms 924 KB
small/10_small-0001 AC 28 ms 924 KB
small/10_small-0002 AC 28 ms 796 KB
small/10_small-0003 AC 29 ms 796 KB
small/10_small-0004 AC 28 ms 800 KB
small/10_small-0005 AC 28 ms 920 KB
small/10_small-0006 AC 28 ms 920 KB
small/10_small-0007 AC 26 ms 916 KB
small/10_small-0008 AC 27 ms 792 KB
small/10_small-0009 AC 28 ms 920 KB
small/10_small-0010 AC 27 ms 916 KB
small/10_small-0011 AC 28 ms 912 KB
small/10_small-0012 AC 28 ms 796 KB
small/10_small-0013 AC 28 ms 800 KB
small/10_small-0014 AC 27 ms 792 KB
small/10_small-0015 AC 28 ms 800 KB
small/10_small-0016 AC 27 ms 804 KB
small/10_small-0017 AC 27 ms 924 KB
small/10_small-0018 AC 28 ms 812 KB
small/10_small-0019 AC 29 ms 928 KB
small/30_max_small AC 26 ms 804 KB
small/40_simple_0000 AC 25 ms 800 KB
small/40_simple_0001 AC 26 ms 912 KB
small/40_simple_0002 AC 25 ms 804 KB
small/40_simple_0003 AC 27 ms 920 KB
small/40_simple_0004 AC 27 ms 796 KB
small/40_simple_0005 AC 26 ms 920 KB
small/40_simple_0006 AC 26 ms 920 KB
small/40_simple_0007 AC 27 ms 920 KB
small/40_simple_0008 AC 26 ms 756 KB
small/40_simple_0009 AC 26 ms 804 KB
small/40_simple_0010 AC 27 ms 792 KB
small/40_simple_0011 AC 26 ms 796 KB
small/40_simple_0012 AC 26 ms 916 KB
small/40_simple_0013 AC 29 ms 800 KB
small/40_simple_0014 AC 27 ms 916 KB
small/40_simple_0015 AC 27 ms 768 KB
small/40_simple_0016 AC 26 ms 920 KB
small/40_simple_0017 AC 26 ms 796 KB
small/40_simple_0018 AC 25 ms 916 KB
small/40_simple_0019 AC 26 ms 808 KB
small/90_dijkstra_killer_00 AC 26 ms 920 KB
small/90_dijkstra_killer_01 AC 26 ms 920 KB
small/91_tayama_killer_00 AC 27 ms 740 KB
small/91_tayama_killer_01 AC 26 ms 676 KB
small/91_tayama_killer_02 AC 26 ms 800 KB
small/91_tayama_killer_03 AC 25 ms 920 KB
small/91_tayama_killer_04 AC 26 ms 916 KB
small/91_tayama_killer_05 AC 25 ms 792 KB