JZOJ 2676. 调整
题目
分析
- 贪心水分??
- 暴力跟多一点??
- 拆点最短路(反正我不会)
- 还是老老实实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 }
为何要逼自己长大,去闯不该闯的荒唐