zoukankan      html  css  js  c++  java
  • HDU 3339 In Action 最短路+01背包~

    题目大意就是 你有足够多的坦克,让你用尽量多的坦克去占领电厂。有N+1各节点,0~n ,0为出发点,1~n为电厂。要想控制摧毁电厂,战胜对方,只需要占领一般的电量即可。但是特克会耗油,所一给你m条路,让你去计算最小耗电量~而且如果坦克不能通过m条路到达任意一个电厂的话就输出'impossible'

    连接:http://acm.hdu.edu.cn/showproblem.php?pid=3339

    代码:dij

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 0x5fffffff
     4 int map[105][105];
     5 int dis[105];
     6 void inint(int n)
     7 {
     8     int j,i;
     9     for(i = 0;i <= n;i++)
    10     {
    11         for(j = 0;j <= n;j++)
    12         if(i != j)map[i][j] = maxn;
    13         else map[i][j] = 0;
    14     }
    15 }
    16 void disj(int n)
    17 {
    18     int vis[105] = {0};
    19     int pre,i,j,k,min;
    20     pre = 0;
    21     for(i = 0;i <= n;i++)
    22     dis[i] = map[pre][i];
    23     vis[pre] = 1;
    24 
    25     for(k = 1;k <= n;k++)
    26     {
    27         for(i = 0;i <= n;i++)
    28         {
    29             if(!vis[i] && dis[i] > dis[pre]+map[pre][i])
    30             dis[i] = dis[pre]+map[pre][i];
    31         }
    32         min = maxn;
    33         for(i = 0;i <= n;i++)
    34         if(min > dis[i] && !vis[i])
    35         min = dis[i],pre = i;
    36 
    37         vis[pre] = 1;
    38     }
    39 }
    40 int main()
    41 {
    42     int T,n,m,i,j,a,b,c,sum,pow[105],spow,f[20005];
    43     scanf("%d",&T);
    44     while(T--)
    45     {
    46         scanf("%d %d",&n,&m);
    47         inint(n);
    48         for(i = 0;i < m;i++)
    49         {
    50             scanf("%d%d%d",&a,&b,&c);
    51             if(c < map[a][b])
    52             map[a][b] = map[b][a] = c;
    53         }
    54 
    55         disj(n);
    56         spow = sum = 0;
    57         for(i = 1;i <= n;i++)
    58         scanf("%d",pow+i),spow+=pow[i];
    59         int leap = 0;
    60         for(i = 1;i <= n;i++)
    61         {
    62             if(dis[i] != maxn)
    63             sum += dis[i];
    64             else
    65             leap = 1;
    66         }
    67         if(leap)
    68         puts("impossible");
    69         else
    70         {
    71             memset(f,0,sizeof(f));
    72             for(i = 1;i <= n;i++)
    73             {
    74                 for(j = sum;j >= dis[i];j--)
    75                 {
    76                     if(f[j] < f[j-dis[i]]+pow[i])
    77                     f[j] = f[j-dis[i]]+pow[i];
    78                 }
    79             }
    80             for(i = 0;i <= sum;i++)
    81             if(f[i] > spow/2)
    82             {
    83                 printf("%d\n",i);
    84                 break;
    85             }
    86         }
    87     }
    88     return 0;
    89 }

    floyd

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 10000050
     4 int map[105][105];
     5 int dis[105];
     6 void inint(int n)
     7 {
     8     int j,i;
     9     for(i = 0;i <= n;i++)
    10     {
    11         for(j = 0;j <= n;j++)
    12         if(i != j)map[i][j] = maxn;
    13         else map[i][j] = 0;
    14     }
    15 }
    16 
    17 int main()
    18 {
    19     int T,n,m,i,j,k,a,b,c,sum,pow[105],spow,f[100005];
    20     scanf("%d",&T);
    21     while(T--)
    22     {
    23         scanf("%d %d",&n,&m);
    24         inint(n);
    25         for(i = 0;i < m;i++)
    26         {
    27             scanf("%d%d%d",&a,&b,&c);
    28             if(c < map[a][b])
    29             map[a][b] = map[b][a] = c;
    30         }
    31 
    32         spow = sum = 0;
    33         for(i = 1;i <= n;i++)
    34         scanf("%d",pow+i),spow+=pow[i];
    35 
    36         for(k = 0;k <= n;k++)
    37         {
    38             for(i = 0;i <= n;i++)
    39             {
    40                 for(j = 0;j <= n;j++)
    41                 if(map[i][j] > map[i][k]+map[k][j])
    42                 map[i][j] = map[i][k]+map[k][j];
    43             }
    44         }
    45 
    46         for(i = 1;i <= n;i++)
    47         {
    48             dis[i] = map[0][i];
    49             if(dis[i] != maxn)
    50             sum += dis[i];
    51         }
    52 
    53         memset(f,0,sizeof(f));
    54         for(i = 1;i <= n;i++)
    55         {
    56             for(j = sum;j >= dis[i];j--)
    57             if(f[j] < f[j-dis[i]] + pow[i])
    58             f[j] = f[j-dis[i]] + pow[i];
    59         }
    60 
    61         for(i = 0;i <= sum;i++)
    62         {
    63             if(f[i] >= spow/2+1)
    64             {
    65                 printf("%d\n",i);
    66                 break;
    67             }
    68         }
    69         if(i > sum)
    70         puts("impossible");
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    [SQL Server]分页功能的实现
    [Others]每个文件夹都具有的特殊文件夹
    [ASP.NET]使页面的大小适合打印尺寸
    [SQL Server]树形结构的创建
    [ASP.NET]获取用户控件对象的引用
    [SQL Server]关于15517号错误的一点想法
    [SQL Server]创建自定义聚合函数值得注意的问题
    Java开源BI商业智能工具
    电子商务网站搜索架构方案
    产品经理如何培养对市场的敏感度和洞察力?
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2639678.html
Copyright © 2011-2022 走看看