beloved_ACM

SB,NB,都是一个B.
posts - 29, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

HDU_3416_In_ACTION_最短路+DP

Posted on 2011-09-08 13:21 成幸毅 阅读(280) 评论(0)  编辑 收藏 引用
#include <iostream>
#include 
<cmath>
#include 
<queue>
using namespace std;

struct Edge {
   
int v,w,next;
}
edge[100010];

const int INF = 0x3fffffff
int sps,head[101],w[101],dist[101];
bool inq[101],n,m;
int f[100001];

void addedge(int u,int v, int w) {
     
     edge[sps].v 
= v;
     edge[sps].w 
= w;
     edge[sps].next 
= head[u]
     head[u] 
= sps++;
}


void spfa() {
   
   
for(int i = 0; i <= n; i++{
      dist[i] 
= ((i==0)?0:INF);
   }

   queue
<int> q;
   q.push(
0);
   memset(inq,
0,sizeof(inq));
   
   
while(!q.empty()) {
      
int u = q.front();q.pop();
      inq[u] 
= false;
      
for(int addr = head[u];addr != -1;addr = edge[addr].next) {
         
int v = edge[addr].v;
         
if(dist[v] > dist[u] + edge[addr].w) {
            dist[v]  
= dist[u] + edge[addr].w;
            
if(!inq[v]) {
               inq[v] 
= true;
               q.push(v);
            }

         }

      }

   }

}


int main() {
    
    
int cas;
    scanf(
"%d",&cas);
    
while(cas--{
       
       sps 
= 0;
       memset(head,
-1,sizeof(head));
       scanf(
"%d%d",&n,&m);
       
int a,b,c;
       
int tot = 0;
       
int cnt = 0;
       
for(int i = 0; i < m; i++{
          scanf(
"%d%d%d",&a,&b,&c);
          addedge(a,b,c);
          addedge(b,a,c);
       }

       
      
       
for(int i = 1; i <= n; i++
          scanf(
"%d",&w[i]);
          cnt 
+= w[i];
       }

       
       spfa();
       
int flag = 0;
       
for(int i = 1; i <= n; i++{
           tot 
+= dist[i];
           
if(dist[i] == INF) { cout<<"impossible"<<endl;flag = 1;break;}
       }

       
if(flag) continue;
      
       
       
for(int i = 0; i < 100001; i++)
          f[i] 
= 0;
       
       cnt 
= cnt/2 + 1;
    
       
for(int i = 1; i <= n;i++{
          
for(int j = tot; j >= dist[i]; j--{
             f[j] 
= max(f[j],f[j-dist[i]] + w[i]);
          }

       }

      
      
       
for(int i = 1; i <= tot; i++{
          
if(f[i] >= cnt) {
             cout
<<i<<endl;
             
break;
          }

       }

    }

        
  
//  system("pause");
    return 0;
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理