社区讨论

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 条回复,欢迎继续交流。

正在加载回复...