HDU3339--In Action(最短路+0-1背包)
2014-01-25 20:43
453 查看
先用最短路求出0到i点的最短距离,然后再用0-1背包做。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 999999999
#define M 105
using namespace std;
int main()
{
int map[M][M],p[M],dp[M*M];
int n,m,t,i,j,k,sum,ave;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=INF;
}
}
while(m--)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
map[u][v]=map[v][u]=min(map[u][v],d);
}
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
sum+=p[i];
}
ave=sum/2;
for(k=0;k<=n;k++)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
int temp=0;
for(i=1;i<=n;i++)
{
if(map[0][i]<INF-10)
temp+=map[0][i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=temp;j>=map[0][i];j--)
{
dp[j]=max(dp[j],dp[j-map[0][i]]+p[i]);
}
}
int flag=0;
for(i=0;i<=temp;i++)
{
if(dp[i]>ave)
{
printf("%d\n",i);
flag=1;
break;
}
}
if(flag==0)
printf("impossible\n");
}
return 0;
}
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 999999999
#define M 105
using namespace std;
int main()
{
int map[M][M],p[M],dp[M*M];
int n,m,t,i,j,k,sum,ave;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=INF;
}
}
while(m--)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
map[u][v]=map[v][u]=min(map[u][v],d);
}
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
sum+=p[i];
}
ave=sum/2;
for(k=0;k<=n;k++)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
int temp=0;
for(i=1;i<=n;i++)
{
if(map[0][i]<INF-10)
temp+=map[0][i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=temp;j>=map[0][i];j--)
{
dp[j]=max(dp[j],dp[j-map[0][i]]+p[i]);
}
}
int flag=0;
for(i=0;i<=temp;i++)
{
if(dp[i]>ave)
{
printf("%d\n",i);
flag=1;
break;
}
}
if(flag==0)
printf("impossible\n");
}
return 0;
}
相关文章推荐
- HDU3339 - In Action - 最短路+01背包dp
- HDU 3339 In Action(背包+最短路)
- HDU 3339 In Action 最短路+01背包
- HDU 3339 In Action(最短路+0-1背包)
- HDU-3339 In Action 最短路+01背包
- HDU3339 In Action(最短路+01背包)
- hdu3339In Action(最短路+01背包)
- HDU3339-In Action(最短路+01背包)
- HDU3339 In Action(最短路+01背包)
- HDU3339 最短路加01背包
- HDU 3339 In Action(最短路+背包)
- hdu 3339 In Action 最短路+(01)背包
- HDU 3339(In Action)最短路SPFA+0-1背包问题
- HDu 3339 In Action 【最短路 + 背包】好题!!!
- HDU 3339 In Action 价值为最短路的背包
- hdu3339 In Action(floyd+背包)
- hdu3339In Action(最短路+01背包)
- In Action 最短路加背包 HDU 3339
- hdu3339 In Action(最短路+01背包)
- hdu 3339 In Action 背包+flyod