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;
    }
    
  • 相关阅读:
    【翻译】谈 focus 和 blur 的事件代理
    【翻译】细分域名的优势
    Form窗体的Combobox键值对绑定
    日志
    ajaxload
    c#文件整理程序
    每天工作4小时的程序员
    每年这一天
    转载从交友到社交的个人成长
    旅行的意义
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678661.html
Copyright © 2011-2022 走看看