zoukankan      html  css  js  c++  java
  • 9.28-10.04

    /主要是图算法方面的, BFS. DFS. 生成树. 最短路径. 二分图. 最大流. 差分约束之类。

    1.Catch That Cow

     1 //直接BFS即可。 注意n>k的情况
     2 #include <iostream>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <vector>
     9 #include <set>
    10 #include <map>
    11 #include <cstdlib>
    12 
    13 using namespace std;
    14 
    15 int n, k;
    16 
    17 int main()
    18 {
    19     int ans = 1000000000;
    20     while (~scanf("%d%d", &n, &k))
    21     {
    22         ans = abs(n-k);
    23         if (n >= k)
    24         {
    25             printf("%d
    ", ans);
    26             continue;
    27         }
    28         queue<pair<int, int> > qu;
    29         while (!qu.empty()) qu.pop();
    30         set<int> st;
    31         qu.push(make_pair(n, 0));
    32         st.insert(n);
    33         while (!qu.empty())
    34         {
    35             int fir = qu.front().first;
    36             int sec = qu.front().second;
    37             if (ans <= sec) break;
    38             if (fir == k)
    39             {
    40                 ans = sec;
    41                 break;
    42             }
    43             else if (fir < k)
    44             {
    45                 if (st.count(fir-1) == 0) qu.push(make_pair(fir-1, sec+1)), st.insertfir-1);
    46                 if (st.count(fir*2) == 0) qu.push(make_pair(2*fir, sec+1)), st.insert(2*fir);
    47                 if (st.count(fir+1) == 0) qu.push(make_pair(fir+1, sec+1)), st.insert(fir+1);
    48             }
    49             else ans = min(fir-k+sec, ans);
    50             qu.pop();
    51         }
    52         printf("%d
    ", ans);
    53     }
    54         
    55     return 0;
    56 }
    View Code

     2.Children of the Candy Corn

      1 //Left && Right分着写的,懒得再合起来了。BFS即可。
      2 #include <iostream>
      3 #include <string>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <algorithm>
      7 #include <queue>
      8 #include <vector>
      9 #include <set>
     10 #include <map>
     11 #include <cstdlib>
     12 
     13 using namespace std;
     14 
     15 const int maxn = 45;
     16 char g[maxn][maxn];
     17 int vis[maxn][maxn];
     18 int t, m, n;
     19 int sx, sy, ex, ey;
     20 
     21 void init()
     22 {
     23     for (int i = 0 ; i < maxn; ++i)
     24         for (int j = 0; j < maxn; ++j)
     25             g[i][j] = '#';
     26 }
     27 
     28 int workLeft()
     29 {
     30     int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
     31     int p = 0, x = sx, y = sy, d = 1;
     32     if (sx == 1) p = 0;
     33     else if (sy == n) p = 1;
     34     else if (sx == m) p = 2;
     35     else p = 3;
     36     while (x != ex || y != ey)
     37     {
     38         d++;
     39         for (int i = 0; i < 4; ++i)
     40         {
     41             int xx = x + dir[(n+4-1)%4][0];
     42             int yy = y + dir[(n+4-1)%4][1];
     43             if (g[xx][yy] != '#') 
     44             {
     45                 x = xx, y = yy, n = (n+4-1)%4;
     46                 break;
     47             }
     48             else n = (n+1)%4;
     49         }
     50     }
     51     return d;
     52 }
     53 
     54 int workRight()
     55 {
     56     int dir[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
     57     int x = sx, y = sy, d = 1;
     58     int p = 0;
     59     if (sx == 0) p = 0;
     60     else if (sy == 1) p = 1;
     61     else if (sx == m) p = 2;
     62     else p = 3;
     63     while (x != ex || y != ey)
     64     {
     65         d++;
     66         for (int i = 0; i < 4; ++i)
     67         {
     68             int xx = x + dir[(n+4-1)%4][0];
     69             int yy = y + dir[(n+4-1)%4][1];
     70             if (g[xx][yy] != '#')
     71             {
     72                 x = xx, y = yy, n = (n+4-1)%4;
     73                 break;
     74             }
     75             else n = (n+1)%4;
     76         }
     77     }    
     78     return d;
     79 }
     80 
     81 int workBest()
     82 {
     83     int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
     84     memset(vis, 0, sizeof(vis));
     85     queue<pair<pair<int, int>, int> > qu;
     86     qu.push(make_pair(make_pair(sx, sy), 1));
     87     vis[sx][sy] = 1;
     88      while (!qu.empty())
     89     {
     90         int x = qu.front().first.first;
     91         int y = qu.front().first.second;
     92         int d = qu.front().second;
     93         qu.pop();
     94         if (x == ex && y == ey) return d;
     95         for (int i = 0; i < 4; ++i)
     96         {
     97             int xx = x + dir[i][0];
     98             int yy = y + dir[i][1];
     99             if (!vis[xx][yy] && g[xx][yy] != '#')
    100             {
    101                 qu.push(make_pair(make_pair(xx, yy), d+1));
    102                 vis[xx][yy] = 1;        
    103             }
    104         }
    105     }
    106 }
    107 
    108 int main()
    109 {
    110     scanf("%d", &t);
    111     while (t--)
    112     {
    113         init();
    114         scanf("%d%d", &n, &m);
    115         for (int i = 1; i <= m; ++i)
    116         {
    117             getchar();
    118             for (int j = 1; j <= n; ++j)
    119             {
    120                 scanf("%c", &g[i][j]);
    121                 if (g[i][j] == 'S')
    122                     sx = i, sy = j;
    123                 if (g[i][j] == 'E')
    124                     ex = i, ey = j;
    125             }
    126         }
    127         printf("%d %d %d
    ", workLeft(), workRight(), workBest());
    128     }    
    129 
    130     return 0;
    131 }
    View Code

     3.Currency Exchange

     1 //Bellman-Ford的变形
     2 #include <iostream>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <vector>
     9 #include <set>
    10 #include <map>
    11 #include <cstdlib>
    12 
    13 using namespace std;
    14 
    15 const int maxn = 105;
    16 
    17 class Node
    18 {
    19 public:
    20     int a, b;
    21     double r, c;    
    22     Node(int aa, int bb, double rr, double cc): a(aa), b(bb), r(rr), c(cc){}
    23 };
    24 
    25 vector<Node> vec;
    26 double dis[maxn];
    27 double v;
    28 int n, m, s;
    29 
    30 void bellmanFord()
    31 {
    32     memset(dis, 0, sizeof(dis));
    33     dis[s] = v;
    34     for (int i = 1; i <= n-1; ++i)
    35     {
    36         for (int j = 0; j < vec.size(); ++j)
    37             dis[vec[j].b] = max(dis[vec[j].b] ,(dis[vec[j].a]-vec[j].c)*vec[j].r);
    38     }
    39     
    40     for (int i = 0; i < vec.size(); ++i)
    41     {
    42         if (dis[vec[i].b] < (dis[vec[i].a]-vec[i].c)*vec[i].r)
    43         {
    44             printf("YES
    ");
    45             return ;
    46         }
    47     }
    48     puts("NO");
    49 }
    50 
    51 int main()
    52 {
    53     while (~scanf("%d%d%d%lf", &n, &m, &s, &v))
    54     {
    55         vec.clear();
    56         int a, b;
    57         double r1, c1, r2, c2;
    58         for (int i = 0; i < m; ++i)
    59         {
    60             scanf("%d%d%lf%lf%lf%lf", &a, &b, &r1, &c1, &r2, &c2);
    61             Node node1(a, b, r1, c1), node2(b, a, r2, c2);
    62             vec.push_back(node1), vec.push_back(node2);
    63         }    
    64         bellmanFord();
    65     }    
    66     
    67     return 0;
    68 }
    View Code

     4.Wormholes

     1 //依旧是BellmanFord即可,不过题目数据太差了,n的数据量不是500,所以开大dis数组即可。
     2 #include <iostream>
     3 #include <string>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <vector>
     9 #include <set>
    10 #include <map>
    11 #include <cstdlib>
    12 
    13 using namespace std;
    14 
    15 #define INF 1e9
    16 const int maxn = 10015;
    17 
    18 class Lode
    19 {
    20 public:
    21     int s, e, t;
    22     Node(int ss, int ee, int tt): s(ss), e(ee), t(tt){}
    23 };
    24 vector<Node> vec;
    25 int f, n, m, w;
    26 int dis[maxn];
    27 
    28 void init()
    29 {
    30     vec.clear();
    31     for (int i = 0; i < maxn; ++i)
    32         dis[i] = INF;
    33 }
    34 
    35 void bellmanFord()
    36 {
    37     dis[1] = 0;
    38     for (int i = 1; i < n-1; ++i)
    39     {
    40         for (int j = 0; j < vec.size(); ++j)
    41             dis[vec[j].e] = min(dis[vec[j].e], dis[vec[j].s]+vec[j].t);
    42     }
    43     for (int i = 0; i < vec.size(); ++i)
    44     {
    45         if (dis[vec[i].e] > dis[vec[i].s] + vec[i].t)
    46         {
    47             puts("YES");
    48             return ;
    49         }
    50     }
    51     puts("NO");
    52 }
    53 
    54 int main()
    55 {
    56     scanf("%d", &f);
    57     while (f--)
    58     {
    59         init();
    60         scanf("%d%d%d", &n, &m, &w);
    61         int s, e, t;
    62         for(int i = 0; i < m; ++i)
    63         {
    64             scanf("%d%d%d", &s, &e, &t);
    65             Node node1(s, e, t);
    66             vec.push_back(node1);
    67             Node node2(e, s, t);
    68             vec.push_back(node2);             
    69         }
    70         for (int i = 0; i < w; ++i)
    71         {
    72             scanf("%d%d%d", &s, &e, &t);
    73             Node node(s, e, -t);
    74             vec.push_back(node);
    75         }
    76         bellmanFord();
    77     }
    78         
    79     return 0;
    80 }
    View Code

     5.昂贵的聘礼

     1 #include <iostream>
     2 #include <string>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <set>
     9 #include <map>
    10 #include <cstdlib>
    11 
    12 using namespace std;
    13 
    14 #define INF 1e9
    15 const int maxn = 105;
    16 
    17 int price[maxn], g[maxn][maxn], level[maxn];
    18 int dis[maxn], vis[maxn];
    19 int n, m, ans;
    20 
    21 void init()
    22 {
    23     memset(price, 0, sizeof(price));
    24     memset(level, 0, sizeof(level));
    25     for (int i = 0; i <= n; ++i)
    26         for (int j = 0; j <= n; ++j)
    27             g[i][j] = INF;
    28 }
    29 
    30 int dijkstra()
    31 {
    32     for (int i = 1; i <= n; ++i)
    33         dis[i] = price[i];
    34     for (int i = 1; i <= n; ++i)
    35     {
    36         int temp = INF, x;
    37         for (int j = 1; j <= n; ++j)
    38             if (!vis[j] && dis[j] < temp)
    39                 temp = dis[x = j];
    40         vis[x] = 1;
    41         for (int j = 1; j <= n; ++j)
    42             if (dis[x]+g[x][j] < dis[j] && !vis[j])
    43                 dis[j] = dis[x]+g[x][j];
    44     }
    45     return dis[1];
    46 }
    47 
    48 int main()
    49 {
    50     while (~scanf("%d%d", &m, &n))
    51     {
    52         init();
    53         for (int i = 1; i <= n; ++i)
    54         {
    55             int x;
    56             scanf("%d%d%d", &price[i], &level[i], &x);
    57             for (int j = 0; j < x; ++j)
    58             {
    59                 int t, v;
    60                 scanf("%d%d", &t, &v);
    61                 g[t][i] = v;
    62             }
    63             g[0][i] = price[i];
    64         }
    65         ans = INF;
    66         for (int i = 1; i <= n; ++i)
    67         {
    68             int minl = level[i];
    69             for<span> (int j = 1; j <= n; ++j)
    70             {
    71                 if (level[j]-minl > m || minl > level[j]) vis[j] = 1;
    72                 else vis[j] = 0;
    73             }
    74             int now = dijkstra();
    75             ans = min(now, ans);
    76         }
    77         printf("%d
    ", ans);
    78     }
    79 
    80     return 0;
    81 }
    View Code

     6.Intervals

     1 //差分约束系统,差分约数系统的含义,其实就是如果有n个变量在m个形如aj-ai>=bk条件下,求解的此不等式的方法。而这种不等式的解法其实就是转化为图论的最小路的算法求解的。
     2 根据题意可得不等式//Sbi - Sai >= ci//Si - Si-1 >= 0//Si-1 - Si >= -1
     3 #include <iostream>
     4 #include <string>
     5 #include <cstdio>
     6 #include <cstring>
     7 #include <algorithm>
     8 #include <queue>
     9/span> #include <vector>
    10 #include <set>
    11 #include <map>
    12 #include <cstdlib>
    13 
    14 using namespace std;
    15 
    16 #define INF 1000000007
    17 #define MIN(a, b) (a > b ? b : a)
    18 #define MAX(a, b) (a > b ? a : b)
    19 #define MAXN 50005
    20 const int maxn = 50005;
    21 struct Edge
    22 {
    23     int v;
    24     int w;
    25     int next;
    26 }edge[MAXN*3];
    27 int head[MAXN], d[MAXN], vis[MAXN];
    28 int n, t, source, target;
    29 
    30 void init()
    31 {
    32     memset(edge, 0, sizeof(edge));
    33     memset(vis, 0, sizeof(vis));
    34     memset(head, -1, sizeof(head));
    35     t = 0;
    36     source = INF, target = -INF;
    37 }
    38 
    39 void addEdge(int u, int v, int w)
    40 {
    41     edge[t].v = v;
    42     edge[t].w = w;
    43     edge[t].next = head[u];
    44     head[u] = t++;
    45 }
    46 
    47 void spfa()
    48 {
    49     for (int i = source; i <= target; ++i) d[i] = -INF;
    50     d[source] = 0;
    51     queue<int> qu;
    52     qu.push(source);
    53     while (!qu.empty())
    54     {
    55         int x = qu.front();
    56         qu.pop();
    57         vis[x] = 0;
    58         for (int e = head[x]; e != -1; e = edge[e].next)
    59             if (d[edge[e].v] < d[x]+edge[e].w)
    60             {
    61                 d[edge[e].v] = d[x] + edge[e].w;
    62                 if (!vis[edge[e].v])
    63                 {
    64                     qu.push(edge[e].v);
    65                     vis[edge[e].v] = 1;
    66                 }
    67             }
    68     }
    69 }
    70 
    71 int main()
    72 {
    73     int u, v, w;
    74     init();
    75     scanf("%d", &n);
    76     for (int i = 0; i < n; ++i)
    77     {
    78         scanf("%d%d%d", &u, &v, &w);
    79         addEdge(u, v+1, w);
    80         source = min(u, source);
    81         target = max(v+1, target);
    82     }
    83     for (int i = source; i < target; ++i)
    84     {
    85         addEdge(i, i+1, 0);
    86         addEdge(i+1, i, -1);    
    87     }
    88     spfa();
    89     printf("%d
    ", d[target]);
    90     
    91     return 0;
    92 }
    View Code

     7.World Exhibition

      1 //差分约束,脑残了,一开始一直拿着带输出测试数据的代码提交,一直wa。。。隐含条件Aj-Ai=无穷大,Ai-Aj<=0
      2 #include <iostream>
      3 #include <string>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <algorithm>
      7 #include <queue>
      8 #include <vector>
      9 #include <set>
     10 #include <map>
     11 #include <cstdlib>
     12 
     13 using namespace std;
     14 
     15 #define INF 1000000007
     16 #define MIN(a, b) (a > b ? b : a)
     17 #define MAX(a, b) (a > b ? a : b)
     18 #define MAXN 1005
     19 #define maxn 10005
     20 struct Edge
     21 {
     22     int v;
     23     int w;
     24     int next;
     25 }edge[maxn*3];
     26 int vis[MAXN], d[MAXN], head[MAXN], use[MAXN];
     27 int t, T, n;
     28 
     29 void init()
     30 {
     31     t = 0;
     32     memset(edge, 0, sizeof(edge));
     33     for (int i = 0; i < MAXN; ++i)
     34         use[i] = 0, vis[i] = 0, d[i] = INF, head[i] = -1;
     35 }
     36 
     37 void addEdge(int u, int v, int w)
     38 {
     39     edge[t].v = v;
     40     edge[t].w = w;
     41     edge[t].next = head[u];
     42     head[u] = t++;    
     43 }
     44 
     45 int spfa()
     46 {
     47     queue<int> qu;
     48     while (!qu.empty()) qu.pop();
     49     d[1] = 0;
     50     qu.push(1);
     51     while (!qu.empty())
     52     {
     53         int x = qu.front();
     54         qu.pop();
     55         vis[x] = 0;
     56         for (int e = head[x]; e != -1; e = edge[e].next)
     57         {
     58             if (d[edge[e].v] > d[x]+edge[e].w)
     59             {
     60                 d[edge[e].v] = d[x]+edge[e].w;
     61                 if (!vis[edge[e].v])
     62                 {
     63                     qu.push(edge[e].v);
     64                     vis[edge[e].v] = 1;
     65                     if (++use[edge[e].v] > n) return -1;
     66                 }
     67             }
     68         }    
     69     }
     70     if (d[n] == INF) return -2;
     71     return d[n];
     72 }
     73 
     74 int main()
     75 {
     76     scanf("%d", &T);
     77     while (T--)
     78     {
     79         init();
     80         int x, y;
     81         scanf("%d%d%d", &n, &x, &y);
     82         int a, b, c;
     83         for (int i = 0; i < x; ++i)
     84         {
     85             scanf("%d%d%d", &a, &b, &c);
     86             addEdge(a, b, c);
     87         }
     88         for (int i = 0; i < y; ++i)
     89         {
     90             scanf("%d%d%d", &a, &b, &c);
     91             addEdge(b, a, -c);
     92         }
     93         for (int i = 2; i <= n; ++i)
     94         {
     95             addEdge(i-1, i, INF);
     96             addEdge(i, i-1, 0);
     97         }
     98         printf("%d
    ", spfa());
     99     }    
    100     
    101     return 0;
    102 }
    View Code

     8.Schedule Problem

      1 //差分约束,构建不等式然后选取最长路。我觉得这题不严谨。。比如FAF 1 2  2 1,我觉得应该是impossible...但是。。。
      2 #include <iostream>
      3 #include <cstdio>
      4 #include <algorithm>
      5 #include <string>
      6 #include <cstring>
      7 #include <set>
      8 #include <stdint.h>
      9 #include <utility>
     10 #include <map>
     11 #include <cstdlib>
     12 #include <queue>
     13 #include <vector>
     14 #include <numeric>
     15 #include <list>
     16 #include <bitset>
     17 #include <exception>
     18 #include <istream>
     19 #include <ostream>
     20 #include <stdexcept>
     21 #include <functional>
     22 #include <stack>
     23 #include <unordered_set>
     24 
     25 #define LL long long int
     26 using namespace std;
     27 
     28 
     29 #define MEM memset
     30 #define MAX (a > b ? a : b)
     31 #define MIN (a < b ? a : b)
     32 #define MAXN 200000
     33 #define LL long long int
     34 #define INF 1000000007
     35 
     36 struct Edge
     37 {
     38     int v;
     39     int w;
     40     int next;
     41 }edge[MAXN];
     42 int d[MAXN], vis[MAXN], use[MAXN], weight[MAXN], head[MAXN], in[MAXN];
     43 int ncas, n, t, a1, a2;
     44 char ch[10];
     45 
     46 void init()
     47 {
     48     t = 0;
     49     memset(edge, 0, sizeof(edge));
     50     for (int i = 0; i < MAXN; ++i)
     51         vis[i] = weight[i] = use[i] = in[i] = 0, d[i] = -INF, head[i] = -1;
     52 }
     53 
     54 void addEdge(int u, int v, int w)
     55 {
     56     edge[t].v = v;
     57     edge[t].w = w;
     58     edge[t].next = head[u];
     59     head[u] = t++;
     60 }
     61 
     62 void judge()
     63 {
     64     in[a1]++;
     65     if (strcmp(ch,"SAF") == 0) addEdge(a2, a1, weight[a2]);
     66     else if (strcmp(ch, "FAF") == 0) addEdge(a2, a1, weight[a2]-weight[a1]);
     67     else if (strcmp(ch, "FAS") == 0) addEdge(a2, a1, -weight[a1]);
     68     else addEdge(a2, a1, 0);
     69 }
     70 
     71 int spfa()
     72 {
     73     int s = 0;
     74     queue<int> qu;
     75     while (!qu.empty()) qu.pop();
     76     d[s] = 0;
     77     qu.push(s);
     78     vis[s] = 1;
     79     while (!qu.empty())
     80     {
     81         int x = qu.front();
     82         qu.pop();
     83         vis[x] = 0;
     84         use[x]++;
     85         if (use[x] > n) return 1;
     86         for (int e = head[x]; e != -1; e = edge[e].next)
     87         {
     88             if (d[edge[e].v] < d[x]+edge[e].w)
     89             {
     90                 d[edge[e].v] = d[x]+edge[e].w;
     91                 if (!vis[edge[e].v])
     92                 {
     93                     qu.push(edge[e].v);
     94                     vis[edge[e].v] = 1;
     95                 }
     96             }
     97         }
     98     }
     99     for (int i = 1; i <= n; ++i)
    100         printf("%d %d
    ", i, d[i]);
    101     return 0;
    102 }
    103 
    104 int main()
    105 {
    106     ncas = 1;
    107     while (~scanf("%d", &n) && n)
    108     {
    109         init();
    110         for (int i = 1; i <= n; ++i)
    111             scanf("%d", &weight[i]);
    112         while (scanf("%s", ch) && ch[0] != '#')
    113         {
    114             scanf("%d %d", &a1, &a2);
    115             judge();
    116         }
    117         for (int i = 1; i <= n; ++i)
    118             addEdge(0, i, 0);
    119         printf("Case %d:
    ", ncas++);
    120         if (spfa()) puts("impossible");
    121         puts("");
    122     }
    123 
    124     return 0;
    125 }
    View Code

     9.Truck History

     1 //Prim算法
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <string>
     6 #include <cstring>
     7 #include <set>
     8 #include <utility>
     9 #include <map>
    10 #include <cstdlib>
    11 #include <queue>
    12 #include <vector>
    13 #include <numeric>
    14 #include <list>
    15 #include <bitset>
    16 #include <exception>
    17 #include <istream>
    18 #include <ostream>
    19 #include <qtdexcept>
    20 #include <functional>
    21 #include <stack>
    22 
    23 #define LL long long int
    24 using namespace std;
    25 
    26 
    27 #define MEM memset
    28 #define MAX (a > b ? a : b)
    29 #define MIN (a < b ? a : b)
    30 #define MAXN 2010
    31 #define LL long long int
    32 #define INF 1000000007
    33 
    34 int g[MAXN][MAXN];
    35 int d[MAXN], vis[MAXN];
    36 char ch[MAXN][10];
    37 int n;
    38 
    39 void init()
    40 {
    41     memset(vis, 0, sizeof(vis));
    42     for (int i = 0; i < n; ++i)
    43         for (int j = 0; j < n; ++j)
    44         {
    45             if (i == j) g[i][j] = 0;
    46             else
    47             {
    48                 int cnt = 0;
    49                 for (int k = 0; k < 7; ++k)
    50                     if (ch[i][k] != ch[j][k]) cnt++;
    51                 g[i][j] = g[j][i] = cnt;
    52             }
    53         }
    54     for (int i = 0; i < n; ++i)
    55         d[i] = g[0][i];
    56 }
    57 
    58 int prim()
    59 {
    60     init();
    61     int k = 0, idx, len, ans = 0;
    62     vis[k] = 1;
    63     for (int i = 1; i < n; ++i)
    64     {
    65         len = INF;
    66         for (int j = 0; j < n; ++j)
    67             if (!vis[j] && d[j] < len)
    68                 len = d[idx = j];
    69         ans += len;
    70         vis[idx] = 1;
    71         for (int j = 0; j < n; ++j)
    72             if (!vis[j] && g[idx][j] < d[j])
    73                 d[j] = g[idx][j];
    74     }
    75     return ans;
    76 }
    77 
    78 int main()
    79 {
    80     while (~scanf("%d", &n) && n)
    81     {
    82         for (int i = 0; i < n; ++i)
    83             scanf("%s", ch[i]);
    84         printf("The highest possible quality is 1/%d.
    ", prim());
    85     }
    86 
    87     return 0;
    88 }
    View Code

     10.Highways

     1 //Prim算法
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <string>
     7 #include <cstring>
     8 
     9 using namespace std;
    10 
    11 #define INF 1000000007
    12 #define MAXN 505
    13 #define MAX(a, b) (a > b ? a : b)
    14 #define MIN(a, b) (a < b ? a : b)
    15 
    16 int t, n;
    17 int d[MAXN], vis[MAXN];
    18 int g[MAXN][MAXN];
    19 
    20 void init()
    21 {
    22     for (int i = 0; i < n; ++i)
    23         d[i] = g[0][i], vis[i] = 0;
    24 }
    25 
    26 int prim()
    27 {
    28     init();
    29     int ans = -INF;
    30     vis[0] = 1;
    31     for (int i = 1; i < n; ++i)
    32     {
    33         int min_cost = INF, idx = 0;
    34         for (int j = 0; j < n; ++j)
    35             if (!vis[j] && d[j] < min_cost)
    36                 min_cost = d[idx = j];
    37         ans = max(ans, min_cost);
    38         vis[idx] = 1;
    39         for (int j = 0; j < n; ++j)
    40             if (!vis[j] && d[j] > g[idx][j])
    41                 d[j] = g[idx][j];
    42     }
    43     return ans;
    44 }
    45 
    46 int main()
    47 {
    48 
    49     scanf("%d", &t);
    50     while (t--)
    51     {
    52         scanf("%d", &n);
    53         for (int i = 0; i < n; ++i)
    54             for (int j = 0; j < n; ++j)
    55                 scanf("%d", &g[i][j]);
    56         printf("%d
    ", prim());
    57     }
    58 
    59     return 0;
    60 }
    View Code

     11.Agri-Net

     1 //prim算法
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <string>
     7 #include <cstring>
     8 
     9 using namespace std;
    10 
    11 #define INF 1000000007
    12 #define MAXN 105
    13 #define MAX(a, b) (a > b ? a : b)
    14 #define MIN(a, b) (a < b ? a : b)
    15 
    16 int n;
    17 int d[MAXN], vis[MAXN];
    18 int g[MAXN][MAXN];
    19 
    20 void init()
    21 {
    22     for (int i = 0; i < n; ++i)
    23         d[i] = g[0][i], vis[i] = 0;
    24 }
    25 
    26 int prim()
    27 {
    28     init();
    29     int ans = 0;
    30     vis[0] = 1;
    31     for (int i = 1; i < n; ++i)
    32     {
    33         int min_cost = INF, idx = 0;
    34         for (int j = 0; j < n; ++j)
    35             if (!vis[j] && d[j] < min_cost)
    36                 min_cost = d[idx = j];
    37         ans += min_cost;
    38         vis[idx] = 1;
    39         for (int j = 0; j < n; ++j)
    40             if (!vis[j] && d[j] > g[idx][j])
    41                 d[j] = g[idx][j];
    42     }
    43     return ans;
    44 }
    45 
    46 int main()
    47 {
    48     while (~scanf("%d", $amp;n))
    49     {
    50         for (int i = 0; i < n; ++i)
    51         for (int j = 0; j < n; ++j)
    52             scanf("%d", &g[i][j]);
    53         printf("%d
    ", prim());
    54     }
    55 
    56     return 0;
    57 }
    View Code

     12.Agri-Net

     1 //Kruskal算法 与上面prim对比一下
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <string>
     7 #include <cstring>
     8 
     9 using namespace std;
    10 
    11 #define INF 1000000007
    12 #define MAXN 105
    13 #define MAX(a, b) (a > b ? a : b)
    14 #define MIN(a, b) (a < b ? a : b)
    15 
    16 struct Edge
    17 {
    18     int u;
    19     int v;
    20     int w;
    21 }edge[MAXN*MAXN];
    22 int n;
    23 int father[MAXN];
    24 
    25 int cmp(const void* a, const void* b)
    26 {
    27     return ((Edge*)a)->w - ((Edge*)b)->w;
    28 }
    29 
    30 int findFather(int val)
    31 {
    32     if (father[val] == val) return val;
    33     return father[val] = findFather(father[val]);
    34 }
    35 
    36 void unionFather(int x, int y)
    37 {
    38     int xx = findFather(x);
    39     int yy = findFather(y);
    40     father[xx] = father[yy];
    41 }
    42 
    43 int main()
    44 {
    45     while (~scanf("%d", &n))
    46     {
    47         for (int i = 0; i < n; ++i)
    48             for (int j = 0; j < n; ++j)
    49             {
    50                 scanf("%d", &edge[i*n+j].w);
    51                 edge[i*n+j].u = i, edge[i*n+j].v = j;
    52             }
    53         for (int i = 0; i < n; ++i) father[i] = i;
    54         qsort(edge, n*n, sizeof(Edge), cmp);
    55         int ans = 0;
    56         for (int i = 0; i < n*n; ++i)
    57         {
    58             if (edge[i].u >= edge[i].v) continue;
    59             if (findFather(edge[i].u) != findFather(edge[i].v))
    60             {
    61                 ans += edge[i].w;
    62                 unionFather(edge[i].u, edge[i].v);
    63             }
    64         }
    65         printf("%d
    ", ans);
    66     }
    67 
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/JustForCS/p/4843281.html
Copyright © 2011-2022 走看看