社区讨论
60分求调
P3489[POI 2009] WIE-Hexer参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mbxmyx6s
- 此快照首次捕获于
- 2025/06/15 20:23 9 个月前
- 此快照最后确认于
- 2025/06/15 21:09 9 个月前
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,p,k,x,y,z,t,ans=1e15,nz;
ll nS[201];
ll fir[201],nxt[6001],to[6001],w[6001],eS[6001],tot;
ll dis[201][16385];
bool vis[201][16385];
inline void add(ll u,ll v,ll we,ll S){
nxt[++tot]=fir[u];
fir[u]=tot;
to[tot]=v;
w[tot]=we;
eS[tot]=S;
}
struct Node{
ll pos,S,dis;
friend bool operator < (const Node &a,const Node &b){return a.dis>b.dis;}
};
priority_queue<Node>q;
int main(){
cin>>n>>m>>p>>k;
for(ll i=1;i<=k;i++){
cin>>x>>y;
for(ll j=1;j<=y;j++){
cin>>z;
nS[x]|=(1ll<<z);
}
}
for(ll i=1;i<=m;i++){
cin>>x>>y>>z>>nz;
ll tS=0;
for(ll j=1;j<=nz;j++){
cin>>t;
tS|=(1ll<<t);
}
add(x,y,z,tS);
add(y,x,z,tS);
}
for(ll i=1;i<=n;i++)for(ll j=0;j<=16384;j++)dis[i][j]=1e15;
dis[1][nS[1]]=0;
q.push({1,0,nS[1]});
while(!q.empty()){
Node now=q.top();
q.pop();
ll u=now.pos,nowS=now.S;
dis[u][nowS|nS[u]]=dis[u][nowS];
nowS|=nS[u];
if(u==n)break;
if(vis[u][nowS])continue;
vis[u][nowS]=1;
for(ll i=fir[u];i;i=nxt[i]){
if((nowS|eS[i])!=nowS)continue;
ll v=to[i];
if(vis[v][nowS])continue;
if(dis[v][nowS]>dis[u][nowS]+w[i]){
dis[v][nowS]=dis[u][nowS]+w[i];
q.push({v,nowS,dis[v][nowS]});
}
}
}
for(ll i=0;i<=16384;i++)ans=min(ans,dis[n][i]);
if(ans==1e15)ans=-1;
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...