zoukankan      html  css  js  c++  java
  • 集训·逛公园

    #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;
    }
    
  • 相关阅读:
    【转】JSch
    【转】JSch
    【转】class卸载、热替换和Tomcat的热部署的分析
    关于Tomcat自动加载更新class的小技巧
    MySQL中order by中关于NULL值的排序问题
    MySQL触发器使用详解
    QuartZ Cron表达式
    JDBC的URL设置allowMultiQueries的原因
    CRT:C运行库简介
    IntelliJ IDEA安装AngularJS插件
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678661.html
Copyright © 2011-2022 走看看