比赛 201712练习 评测结果 AAAAAAAAAA
题目名称 逛公园 最终得分 100
用户昵称 胡嘉兴 运行时间 4.429 s
代码语言 C++ 内存使用 49.15 MiB
提交时间 2017-12-23 08:00:37
显示代码纯文本
#include<bits/stdc++.h>
#define N 100007
#define M 57
using namespace std;
vector<int> vec[N];
vector<int> w[N];
vector<int> rev[N];
vector<int> revc[N];
int n, m, k, p;
int vis[N], dis[N], f[N][M], book[N][M], flag;
void spfa(int s)
{
	deque<int> que(0);
	que.push_back(s);
	memset(vis, 0, sizeof(vis));
	memset(dis, 0x3f, sizeof(dis));
	dis[s] = 0;
	while(!que.empty())
	{
		int u = que.front();
		que.pop_front();
		for(int i = 0; i < rev[u].size(); i++)
		{
			int v = rev[u][i];
			if(dis[u]+revc[u][i]<dis[v])
			{
				dis[v] = dis[u]+revc[u][i];
				if(!vis[v])
				{
					que.push_back(v);
					vis[v] = 1;
				}
			}
		}
		vis[u] = 0;
	}
	return;
}
int dfs(int x, int k)
{
    if(f[x][k]>=0)
    {
        return f[x][k];
    }
    f[x][k] = 0;
    book[x][k] = 1;
    for(int i = 0; i < vec[x].size(); i++)
    {
        int y = vec[x][i], c = w[x][i];
        int t = k-c+dis[x]-dis[y];
        if(t<0||t>k)
        {
            continue;
        }
        if(book[y][t])
        {
            flag = 1;
            return 0;
        }
        f[x][k] += dfs(y, t);
        f[x][k] %= p;
    }
    book[x][k] = 0;
    return f[x][k];
}
int main()
{
	int t;
	freopen("2017park.in", "r", stdin);
	freopen("2017park.out", "w", stdout);
	scanf("%d", &t);
	while(t--)
	{
	    int ans = 0;
		scanf("%d%d%d%d", &n, &m, &k, &p);
		for(int i = 1; i <= n; i++)
		{
			vec[i].clear();
			w[i].clear();
			rev[i].clear();
			revc[i].clear();
		}
		for(int i = 1; i <= m; i++)
		{
			int x, y, z;
			scanf("%d%d%d", &x, &y, &z);
			vec[x].push_back(y);
			w[x].push_back(z);
			rev[y].push_back(x);
			revc[y].push_back(z);
		}
		spfa(n);
		memset(f, -1, sizeof(f));
		memset(book, 0, sizeof(book));
		flag = 0;
		f[n][0] = 1;
		for(int i = 0; i <= k; i++)
        {
            ans += dfs(1, i);
            ans %= p;
        }
        if(flag)
        {
            puts("-1");
            continue;
        }
		printf("%d\n", ans);
	}
	return 0;
}