#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline int read(){int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e2+5;
int n,m;
int dis[maxn][maxn];
int dp[100005],p[maxn];
// 最短路 + 01背包
void floyd() // floyd 求最短路
{
for(int k=0;k<=n;k++)
for(int j=0;j<=n;j++)
for(int i=0;i<=n;i++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
void solve(int tmp) // 01背包
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=tmp;j>=dis[0][i];j--)
dp[j]=max(dp[j],dp[j-dis[0][i]]+p[i]);
}
int main()
{
int t=read();
while(t--){
n=read(),m=read();
memset(dis,INF,sizeof(dis));
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
dis[u][v]=min(dis[u][v],w);
dis[v][u]=dis[u][v];
}
int tmp=0,sum=0;
for(int i=1;i<=n;i++) p[i]=read(),sum+=p[i];
for(int i=1;i<=n;i++) if(dis[0][i]!=INF) tmp+=dis[0][i];
sum/=2;
floyd();
solve(tmp);
bool flag=false;
for(int i=0;i<=tmp;i++){
if(dp[i]>sum){
flag=true;
printf("%d\n",i);
break;
}
}
if(!flag) printf("impossible\n");
}
return 0;
}
最短路 : 01背包
最新推荐文章于 2022-04-06 15:29:15 发布