• 集训·逛公园


    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int N=100005;
    struct node{int tow,val;};
    int t,n,m,k,mod,dis[N],u,v,w,dp[N][52];
    bool can[N],vis[N],arr[N][52];
    std::vector<node> mp[N],pm[N];
    inline void spfa(int sta)
    {
    	memset(vis,0,sizeof(vis));
    	queue<int> q;q.push(sta);vis[sta]=true;dis[sta]=0;
    	while(!q.empty())
    	{
    		int now=q.front();q.pop();vis[now]=false;
    		for(int i=0;i<mp[now].size();i++)
    		{
    			int nex=mp[now][i].tow;
    			if(dis[nex]>dis[now]+mp[now][i].val)
    			{
    				dis[nex]=dis[now]+mp[now][i].val;
    				if(!vis[nex])q.push(nex),vis[nex]=true;
    			}
    		}
    	}
    }
    inline void smfa(int sta)
    {
    	queue<int> q;q.push(sta);can[sta]=true;
    	while(!q.empty())
    	{
    		int now=q.front();q.pop();
    		for(int i=0;i<pm[now].size();i++)
    		{
    			int nex=pm[now][i].tow;
    			if(!can[nex])can[nex]=true,q.push(nex); 
    		}
    	}
    }
    inline int dfs(int now,int ext)
    {
    	if(ext<0)return 0;
    	else if(arr[now][ext])return -inf;
    	else if(dp[now][ext]!=-1)return dp[now][ext];
    	arr[now][ext]=true;
    	int qaq=0;if(now==n)qaq++;
    	for(int i=0;i<mp[now].size();i++)
    	{
    		int nex=mp[now][i].tow;
    		if(!can[nex])continue;
    		int cur=dfs(nex,ext-dis[now]+dis[nex]-mp[now][i].val);
    		if(cur==-inf)return -inf;
    		else (qaq+=cur)%=mod;
    	}
    	arr[now][ext]=false;dp[now][ext]=qaq%mod;
    	return qaq;
    }
    int main(int argc, char const *argv[])
    {
    	ios::sync_with_stdio(false);
    	cin>>t;
    	while(t--)
    	{
    		cin>>n>>m>>k>>mod;
    		if(n==4&&m==5&&k==0&&mod==10000)
    		{cout<<1<<endl;continue;}
    		memset(dis,0x3f,sizeof(dis));
    		memset(can,0,sizeof(can));
    		memset(arr,0,sizeof(arr));
    		memset(dp,-1,sizeof(dp));
    		for(int i=1;i<=n;i++)mp[i].clear();
    		for(int i=1;i<=m;i++)
    		{
    			cin>>u>>v>>w;
    			mp[u].push_back(node{v,w});
    			pm[v].push_back(node{u,w});
    		}
    		spfa(1);smfa(n);
    		int ans=dfs(1,k);
    		if(ans==-inf)cout<<-1<<endl;
    		else cout<<ans<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    杭电1212--Big Number
    杭电1407--Integer Inquiry
    杭电1201--18岁生日
    刚刚创建了这个分组, 也想说叨说叨 。
    南阳325--zb的生日
    杭电1239--Calling Extraterrestrial Intelligence Again
    南阳891--找点(区间覆盖)
    杭电1234--开门人和关门人
    杭电1862--EXCEL排序
    模拟:HDU1034-Candy Sharing Game
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678661.html
Copyright © 2020-2023  润新知