zoukankan      html  css  js  c++  java
  • 2017冬季24集训模拟-1.寻找幽灵

    ————————————————————————————————————————————题解

    把最短路处理出来然后做背包

    没有把head数组和all初始化qwq

     1 #include <iostream>
     2 #include <queue>
     3 #include <set>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <vector>
     7 #include <algorithm>
     8 #define siji(i,x,y) for(int i=x;i<=y;++i)
     9 #define gongzi(j,x,y) for(int j=x;j>=y;--j)
    10 #define xiaosiji(i,x,y) for(int i=x;i<y;++i)
    11 #define sigongzi(j,x,y) for(int j=x;j>y;--j)
    12 #define ivorysi
    13 #define inf 0x5f5f5f5f
    14 #define mo 97797977
    15 #define ha 974711
    16 #define ba 47
    17 #define fi first
    18 #define se second
    19 #define pii pair<int,int>
    20 typedef long long ll;
    21 using namespace std;
    22 struct node {
    23     int to,next,val;
    24 }edge[20005];
    25 int head[105],sumedge;
    26 int n,m,num[105],all,T,ans;
    27 int dist[105],f[20005],vis[105];
    28 void add(int u,int v,int c) {
    29     edge[++sumedge].to=v;
    30     edge[sumedge].next=head[u];
    31     edge[sumedge].val=c;
    32     head[u]=sumedge;
    33 }
    34 void spfa(int u) {
    35     vis[u]=1;
    36     for(int i=head[u];i;i=edge[i].next) {
    37         int v=edge[i].to,w=edge[i].val;
    38         if(dist[u]+w < dist[v]) {
    39             dist[v]=dist[u]+w;
    40             if(!vis[v]) {
    41                 spfa(v);
    42             }
    43         }
    44     }
    45     vis[u]=0;
    46 }
    47 void init() {
    48     scanf("%d%d",&n,&m);
    49     int u,v,w;
    50     sumedge=0;
    51     memset(head,0,sizeof(head));
    52     all=0;
    53     siji(i,1,m) {
    54         scanf("%d%d%d",&u,&v,&w);
    55         ++u,++v;
    56         add(u,v,w);
    57         add(v,u,w);
    58     }
    59     siji(i,2,n+1) {scanf("%d",&num[i]);all+=num[i];}
    60     dist[1]=0;
    61     siji(i,2,n+1) dist[i]=inf;
    62     spfa(1);
    63     f[0]=0;
    64     siji(i,1,all) f[i]=inf;
    65     ans=inf;
    66 }
    67 void solve() {
    68     scanf("%d",&T);
    69     while(T--) {
    70         init();
    71         siji(i,2,n+1) {
    72             if(dist[i]>=inf) continue;
    73             gongzi(j,all,num[i]) {
    74                 if(f[j-num[i]] < f[j]-dist[i]) {
    75                     f[j]=f[j-num[i]]+dist[i];
    76                 }
    77             }
    78         }
    79         int half=all/2+1;
    80         siji(i,half,all) {
    81             if(ans>f[i]) ans=f[i];
    82         }
    83         if(ans>=inf) puts("impossible");
    84         else printf("%d
    ",ans);
    85     }
    86 }
    87 int main(int argc, char const *argv[])
    88 {
    89 #ifdef ivorysi
    90     freopen("release.in","r",stdin);
    91     freopen("release.out","w",stdout);
    92 #else
    93     freopen("f1.in","r",stdin);
    94 #endif
    95     solve();
    96     return 0;
    97 }
  • 相关阅读:
    gridview列的汇总
    windows phone 页面传值(7)
    windows phone 获取手机图片库中图片(4)
    windows phone 使用相机并获取图片(3)
    windows phone 页面导航(6)
    windows phone 三种数据共享的方式(8)
    windows phone 独立存储空间的操作 (2)
    ref 和out传参的不同
    Web Service 实例
    关于DataList,Repeater,GridView的一些问题!! joe
  • 原文地址:https://www.cnblogs.com/ivorysi/p/6395294.html
Copyright © 2011-2022 走看看