95分求助,WA第三个点
查看原帖
95分求助,WA第三个点
716859
JiaDJ楼主2023/8/3 11:08
#include<bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
int n,m,k,g,limits[25],belong[25],cur,sum[(1<<25)+50],pbelong[(1<<25)+50],f[2][200005][25],head[200005<<1],tot;
vector<int> p[25];
struct edge{
	int u,v,w;
	int next;
}e[200005<<1];
void add(int u,int v,int w){
	e[++tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].next=head[u];
	head[u]=tot;
}
int dis[20005],dist[25][2],diss[25][25];
bool vis[20005];
void dijkstra(int x){
	memset(dis,0x3f3f3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[belong[x]]=0;
	priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > >Q;
	while(!Q.empty())
		Q.pop();
	Q.push({0,belong[x]});
	while(!Q.empty()){
		pair<int,int>  s=Q.top();
		Q.pop();
		int temp=s.second,distance=s.first;
		if(vis[temp]==1) continue;
		vis[temp]=1;
		for(int i=head[temp];i;i=e[i].next){
			int j=e[i].v;
			if(distance+e[i].w<dis[j]){
				dis[j]=distance+e[i].w;
				Q.push({dis[j],j});
			}
		}
	}
	dist[x][0]=dis[1],dist[x][1]=dis[n];
	for(int i=0;i<k;++i)
		diss[x][i]=dis[belong[i]];
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	int x,y,z;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	if(k!=0){							
		scanf("%d",&g);
		int r,s;
		for(int i=1;i<=g;i++){
			scanf("%d%d",&r,&s);
			limits[s-2]|=(1<<(r-2));
		}
	}
	if(k==0){
		belong[1]=1;		
		dijkstra(1);
		printf("%d\n",dis[n]);
		return 0;
	}
	for(int i=0;i<k;i++)
		belong[i]=i+2;
	for(int s=1;s<(1<<k);s++){
		sum[s]=sum[s&(~(lowbit(s)))]+1;
		p[sum[s]].push_back(s);
		pbelong[s]=p[sum[s]].size()-1;
	}
	memset(f,0x3f,sizeof(f));
	for(int i=0;i<k;i++){
		dijkstra(i);
		if(!limits[i])	
			f[cur][pbelong[1<<i]][i]=dist[i][0];
	}
	cur=0;
	for(int i=2;i<=k;i++){
		int len=p[i].size();
		cur^=1;			
		memset(f[cur],0x3f,sizeof(f[cur]));
		for(int e=0;e<len;e++){
			int s=p[i][e];
			for(int j=0;j<k;j++)
				if((s&(1<<j))&&((limits[j]&(s&(~(1<<j))))==limits[j]))
					for(int q=0;q<k;++q)
						if(j!=q&&(s&(1<<q)) )
							f[cur][e][j]=min(f[cur][e][j],f[cur^1][pbelong[s&(~(1<<j))]][q]+diss[q][j]);
		}
	}
	int ans=0x3f3f3f;
	for(int i=0;i<k;i++)
		ans=min(ans,f[cur][0][i]+dist[i][1]);
	printf("%d\n",ans);
	return 0;
}
2023/8/3 11:08
加载中...