比赛的时候写了个记忆化搜索,超时了。

后来学习了一下,这种题目应该用拓扑排序+DP来做。

dp[][]保存走到[第i个节点][走过j个点]时所用的最短时间。

pre[][]用前驱节点求路径

然后遍历一下dp[n][],求满足t范围的最大下标。

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <stack>
#define N 5050
#define INF 1000000200
//#define LL long long int
using namespace std;
int n,m,sum,cnt,flag,t;
int deg[N];
vector<int> g[N],f[N];//保存后继节点
int dp[N][N],pre[N][N];//保存走到第i个点,走过j个点时所用时间
struct cmp
{
bool operator()(int a,int b)
{
return a>b;
}
};
void topoSort()
{
priority_queue<int,vector<int>,cmp> q;
for(int i=;i<=n;i++)
if(deg[i]==)
q.push(i),deg[i]--;
while(!q.empty())
{
//if(q.size()>1) 可用于判断是否充分排序。
//如果有多个入度为0的同时入队,说明他们之间没有明确的排序条件。
int u=q.top();
q.pop();
sum--;//可用于判断是否有冲突,如果有冲突,就会导致两者或者已上的节点入度无法降为0
for(int i=;i<g[u].size();i++)
{
int e=g[u][i];
deg[e]--;
for(int j=;j<=n;j++)
{
//cout<<dp[u][i]<<' '<<e<<endl;
if(dp[e][j]>dp[u][j-]+f[u][i])
dp[e][j]=dp[u][j-]+f[u][i],pre[e][j]=u;
}
}
for(int i=;i<=n;i++)
if(deg[i]==)
q.push(i),deg[i]--;
}
}
void ini()
{
for(int i=;i<=n;i++)
deg[i]=,flag=,g[i].clear(),f[i].clear();
cnt=,sum=n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dp[i][j]=t+,pre[i][j]=-;
dp[][]=;
}
void add(int u,int v,int fe)
{
deg[v]++;
g[u].push_back(v);
f[u].push_back(fe);
}
int main() {
//cin.sync_with_stdio(false);
scanf("%d%d%d",&n,&m,&t);
ini();
for(int i=;i<m;i++)
{
int u,v,fe;
scanf("%d%d%d",&u,&v,&fe);
add(u,v,fe);
}
//cout<<dp[1][2]<<endl;
topoSort();
int Maxp=-;
for(int i=;i<=n;i++)
{
if(dp[n][i]<=t)
Maxp=i;//求最大合法经过点数
}
stack<int> ss;
int pos=n,lef=Maxp;
cout<<Maxp<<endl;
while(pos!=-)
{
ss.push(pos);
pos=pre[pos][lef],lef--;
}
//ss.push(1);
while(ss.size()>)
cout<<ss.top()<<' ',ss.pop();
cout<<ss.top()<<endl;
ss.pop(); return ;
}

最新文章

  1. java获取当前时间前一周、前一月、前一年的时间
  2. [nginx] connect() failed (111: Connection refused) while connecting to upstream, client: 101.18.123.107, server: localhost,
  3. [Linux编程]__read_mostly变量含义
  4. git删除远程仓库的文件或目录
  5. Java Script 练习题
  6. 小记:Quartz StartNow() 无效
  7. Python网络编程(2)——socket模块(2)
  8. Java [leetcode 24]Swap Nodes in Pairs
  9. Core Data-备用
  10. (转)ultraedit for linux 安装与注册破解
  11. [转]PHP实现页面静态化的超简单方法
  12. target和currentTarget
  13. 【Teradata】并行操作工具
  14. P1101 单词方阵 (单词方阵)
  15. Expression 生成 Lambda
  16. Android签名文件转化为pk8和pem来对apk重签名
  17. 【LeetCode】字符串匹配
  18. 转]GSM模块信号强度CSQ与RSSI的对应关系
  19. python快速入门——进入数据挖掘你该有的基础知识
  20. vim 之cscope的使用

热门文章

  1. topcoder srm 691 div1 -3
  2. minicom支持向串口自动发送命令的功能
  3. C Primer Plus 创建友好的输入界面 笔记
  4. 颠倒的价牌|2013年蓝桥杯A组题解析第四题-fishers
  5. Nginx配置示例
  6. Qt实在太漂亮了
  7. MVC杂记
  8. 使用CSS渐变
  9. 面试题中关于String的常见操作
  10. 使用pymongo连接mongodb时报错:pymongo.errors.OperationFailure: not authorized