列表

详情


NC15799. EL PSY CONGROO

描述

在这个世界上有很多的世界线, 疯狂科学家·凤凰院凶真具有能够改变世界线的能力
但是这种能力是单向的(比如α世界线能够到达β世界线, 但是β世界线不能够到达α世界线), 并且在他改变当前世界线之后, 就没有世界线能够回到当前的世界线了
他现在处于α世界线, 但是在α世界线中他的助手牧濑红莉栖会因为意外而死去
并且因为世界线的收束, 凤凰院凶真必须到达"命运石之门"的β世界线才能够拯救助手
因为世界线之间的关系太过复杂, 凤凰院凶真需要你的帮助来拯救助手
他想知道有多少条路线从α世界线去往β世界线, 为了方便起见, 我们把能够观测到的世界线的编号标记为1到n

输入描述

第一行包含四个整数n, m, α, β含义如题目所示
接下来m行每行包括两个数u, v, 表示u世界线能够到达v世界线

输出描述

如果α世界线能够到达β世界, 那么输出一个整数, 表示α世界线能够到达β世界线有多少条路线(可能路线太多, 只需要输出路线的数量对98319取模(余)后的结果)
否则输出"TAT"(不包含引号)

示例1

输入:

3 4 1 3
1 2
1 3
2 3
1 2

输出:

3

示例2

输入:

3 3 2 1
1 2
1 3
2 3

输出:

TAT

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0)(g++7.5.0) 解法, 执行用时: 112ms, 内存消耗: 12824K, 提交时间: 2023-05-01 10:20:05

#include <iostream>
#include <vector>
#include <queue>

const int N = 1e5 + 10;
const int P = 98319;
int dp[N];

std::vector<int> redge[N];
int s, t;

int dfs(int u) {
    if (dp[u] != -1) return dp[u];
    int &res = dp[u] = 0;
    if (redge[u].empty()) return res = int(u == s);
    for (int v : redge[u]) {
        res = (res + dfs(v)) % P;
    }
    return res;
}

int main() {
    std::cin.tie(nullptr) -> sync_with_stdio(false);

    int n, m;
    std::cin >> n >> m >> s >> t;

    while (m--) {
        int u, v;
        std::cin >> u >> v;
        redge[v].push_back(u);
    }
    std::fill(dp + 1, dp + n + 1, -1);

    int res = dfs(t);

    if (dp[s] != -1) std::cout << res << '\n';
    else std::cout << "TAT\n";

    return 0;
}

C++(clang++11) 解法, 执行用时: 156ms, 内存消耗: 13876K, 提交时间: 2021-03-24 18:56:37

#include<bits/stdc++.h>
using namespace std;
#define mod 98319
#define maxn 100010
int vis[maxn],dp[maxn],n,m,u,v,st,ed;
bool flag;
struct Node
{
	int id,num;
};
vector<int>Q[maxn];
int DFS(int pos)
{
	if(pos==ed) return flag=1;
	if(vis[pos]==-1) return dp[pos];
	int ans=0;
	for(int i=0;i<Q[pos].size();i++)
	{
		ans=(ans+DFS(Q[pos][i]))%mod;
	}
	vis[pos]=-1;
	return dp[pos]=ans;
}
int main()
{
	int ans;
	while(~scanf("%d%d%d%d",&n,&m,&st,&ed))
	{
		flag=0;
		memset(vis,0,sizeof(vis));
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
		Q[i].clear();
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&u,&v);
			Q[u].push_back(v);
		}
		ans=DFS(st);
		if(flag==0)
		cout<<"TAT"<<endl;
		else
		cout<<ans<<endl;
	}
	return 0;
}

上一题