nyoj 203 三国志 dijkstra+01背包
2014-05-22 12:28
211 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203
思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了
我奇怪的是100*1000000的时间复杂度居然没有超时!
代码如下:
思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了
我奇怪的是100*1000000的时间复杂度居然没有超时!
代码如下:
#include "stdio.h" #include "string.h" #define N 105 #define INF 0x3fffffff bool mark ; int dist ; int map ; int dp[1000005]; void Init(int n) { for(int i=0; i<=n; ++i) { for(int j=0; j<=n; ++j) map[i][j] = INF; } } void dij(int n) { int i,j,k; memset(mark,false,sizeof(mark)); for(i=0; i<=n; ++i) dist[i] = map[0][i]; mark[0] = true; int mint; for(i=1; i<=n; ++i) { k = 0; mint = INF; for(j=0; j<=n; ++j) { if(!mark[j] && mint>dist[j]) { mint = dist[j]; k = j; } } mark[k] = true; for(j=0; j<=n; ++j) { if(!mark[j] && dist[j]>dist[k]+map[k][j]) dist[j] = dist[k]+map[k][j]; } } } int value ; int main() { int T; int n,sum,m; int i,j; int x,y,k; scanf("%d",&T); while(T--) { scanf("%d %d %d",&sum,&n,&m); Init(n); while(m--) { scanf("%d %d %d",&x,&y,&k); if(k<map[x][y]) map[x][y] = map[y][x] = k; } for(i=1; i<=n; ++i) scanf("%d",&value[i]); dij(n); memset(dp,0,sizeof(dp)); for(i=1; i<=n; ++i) //01背包 { for(j=sum; j>=dist[i]; j--) { if(dp[j] < dp[j-dist[i]] + value[i]) dp[j] = dp[j-dist[i]]+value[i]; } } int ans = 0; for(i=1; i<=sum; ++i) ans = ans>dp[i]?ans:dp[i]; printf("%d\n",ans); } return 0; }
相关文章推荐
- nyoj 203 三国志 dijkstra+01背包
- NYOJ 203 三国志(Dijkstra+贪心)
- nyoj- 203 三国志 DJ+ 0/1背包
- nyoj--203--三国志(迪杰斯特拉+背包)
- nyoj--203--三国志(迪杰斯特拉+背包)
- NYOJ 203 三国志(Dijkstra+贪心)
- NYOJ 820 又见01背包 (价值和重量互换)
- NYOJ 860 又见01背包
- 01背包问题 nyoj 289 hdoj 2546
- nyoj860 01背包变形-好题
- NYOJ 860 又见01背包
- 【志银】NYOJ《题目860》又见01背包
- nyoj860_又见01背包
- nyoj 又见01背包
- nyoj860又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包(01背包理解运用)
- nyoj860又见01背包
- nyoj860--又见01背包(01背包的另一种形态)
- NYOJ 860 又见01背包