zoukankan      html  css  js  c++  java
  • nyoj 三国志 (Dijkstra + 01背包)

    。。。 总是没思路  真要命

    注意两点之间可能有多条权值不同的路径,不过只要在输入时取最小值就好了。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<queue>
     7 #include<algorithm>
     8 #include<map>
     9 #include<iomanip>
    10 #include<climits>
    11 #include<string.h>
    12 #include<cmath>
    13 #include<stdlib.h>
    14 #include<vector>
    15 #include<set>
    16 #define INF 1e7
    17 #define MAXN 100010
    18 #define maxn 50
    19 #define maxm 1000
    20 #define Mod 1000007
    21 using namespace std;
    22 typedef long long LL;
    23 
    24 
    25 int T;
    26 int s, n, m;
    27 int a, b, c;
    28 int v[110];
    29 int G[110][110];
    30 int dist[1000010];
    31 int vis[110];
    32 int dp[1000010];
    33 
    34 void Dijkstra()
    35 {
    36     for (int i = 0; i <= n; ++i)
    37         dist[i] = G[0][i],vis[i] = 0;
    38     int pos, min;
    39     vis[0] = 1;
    40     dist[0] = 0;
    41     for (int i = 1; i <= n; ++i) {
    42         min = INF;
    43         for (int j = 1; j <= n; ++j) {
    44             if (!vis[j] && min > dist[j]) {
    45                 pos = j;
    46                 min = dist[j];
    47             }
    48         }
    49         vis[pos] = 1;
    50         for (int j = 1; j <= n; ++j) {
    51             if (!vis[j] && dist[j] > dist[pos] + G[pos][j])
    52                 dist[j] = dist[pos] + G[pos][j];
    53         }
    54     }
    55 }
    56 
    57 void bag01()
    58 {
    59     for (int i = 1; i <= n; ++i)
    60         for (int j = s; j >= dist[i]; --j)
    61             dp[j] = max(dp[j - dist[i]] + v[i],dp[j]);
    62 }
    63 
    64 void run()
    65 {
    66     scanf("%d%d%d", &s, &n, &m);
    67     memset(v,0,sizeof(v));
    68     memset(dp,0,sizeof(dp));
    69     for (int i = 0; i <= n; ++i)
    70         for (int j = 0; j <= n; ++j)
    71             G[i][j] = INF;
    72     for (int i = 0; i < m; ++i) {
    73         scanf("%d%d%d", &a, &b, &c);
    74         if (c < G[a][b])
    75             G[a][b] = G[b][a] = c;
    76     }
    77     for (int i = 1; i <= n; ++i) 
    78         scanf("%d",&v[i]);
    79     Dijkstra();
    80     bag01();
    81     printf("%d
    ",dp[s]);
    82 }
    83 int main()
    84 {
    85     scanf("%d", &T);
    86     while (T--)
    87         run();
    88     return 0;
    89 }
  • 相关阅读:
    这个网站的设计太独特了
    mybatis—— 一个空格引发的血案
    Java IO--实现文件的加密解密
    Intellij IDEA如何生成JavaDoc--转载
    Java 在循环里发生异常会跳出循环
    idea格式化代码快捷键
    idea创建类时默认添加头部注释信息
    maven-helper解决依赖冲突
    Octotree插件
    idea .gitignore(git文件忽略)
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4337882.html
Copyright © 2011-2022 走看看