题目
分析
- 贪心水分??
- 暴力跟多一点??
- 拆点最短路(反正我不会)
- 还是老老实实DP
- 设f[i][j],表示从1出发到达节点i,用了j次修改的最小值
- 那么显然f[y][j]=f[x][j]+map[x][y] ,f[y][j+1]=f[x][j]
- 记得不能超出深度哦
代码
1 #include<iostream>
2 #include<vector>
3 #include<queue>
4 #include<cstring>
5 #include<algorithm>
6 using namespace std;
7 vector<int> f[2001];
8 int vis[2001];
9 int n,m,c;
10 int a[2001];
11 int map[2001][2001];
12 int dp[2001][2001];
13 int dis[2001];
14 void spfa()
15 {
16 memset(dp,0x3f,sizeof(dp));
17 dp[1][0]=0;
18 queue<int> q;
19 q.push(1); vis[1]=1;
20 while (!q.empty())
21 {
22 int x=q.front(); q.pop(); vis[1]=0;
23 for (int i=0;i<f[x].size();i++)
24 {
25 int y=f[x][i];
26 if (!vis[y])
27 {
28 dis[y]=dis[x]+1;
29 vis[y]=1;
30 for (int i=0;i<=dis[x];i++)
31 dp[y][i]=min(dp[y][i],dp[x][i]+map[x][y]),dp[y][i+1]=min(dp[y][i+1],dp[x][i]);
32 q.push(y);
33 }
34
35 }
36 }
37 }
38 int main ()
39 {
40 cin>>n>>m>>c;
41 for (int i=1,x,y,z;i<=m;i++)
42 {
43 cin>>x>>y>>z;
44 f[x].push_back(y);
45 map[x][y]=z;
46 }
47 spfa();
48 for (int i=0;i<=m;i++)
49 if (dp[n][i]<=c)
50 {
51 cout<<i;
52 break;
53 }
54 }