#pragma GCC optimize(3,"Ofast","inline")
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
#define int long long
#define ld long double
int n,m;
const int N=1e3+5;
const int INF=1e17;
pair<int,pair<int,int>>e[N];
int dist[5000];
void solve()
{
cin>>n>>m;
bitset<10>sx;
//因为字符串的位数最高是10位,最多出现1024个不同的字符串,
cin>>sx;
int s=sx.to_ullong();//二进制转换成十进制
for(int i=1;i<=m;i++){
int dx;//距离
bitset<10>ux,vx;
cin>>dx>>ux>>vx;
int u=ux.to_ullong();
int v=vx.to_ullong();
e[i].first=dx;
e[i].second=make_pair(u,v);
}
for(int i=0;i<=(1<<(n+1));i++)
dist[i]=INF;
dist[s]=0;
set<pair<int,int>>q;
//用集合记录创造出的点,及到其的最短距离,避免重复
q.insert(make_pair(0,s));
while(!q.empty()){
auto k=*q.begin();
q.erase(q.begin());
int d=k.first;
int u=k.second;//点
for(int i=1;i<=m;i++){//二进制操作,更新新节点最短距离
int v=u&(~e[i].second.first)|e[i].second.second;
if(dist[v]>d+e[i].first){
q.erase(make_pair(dist[v],v));
dist[v]=d+e[i].first;
q.insert(make_pair(dist[v],v));
}
}
}
int ans=dist[0];
if(ans==INF) ans=-1;
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t; cin>>t;
while(t--)
{
solve();
}
return 0;
}
G. Rudolf and CodeVid-23
最新推荐文章于 2024-05-21 20:29:42 发布