求第6个数据
  • 板块题目总版
  • 楼主Str_ywr
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/10/10 20:35
  • 上次更新2023/10/27 07:57:39
查看原帖
求第6个数据
513717
Str_ywr楼主2022/10/10 20:35

或者那位好心人能帮我看看代码QAQ

//t6:2147483646,应为 9。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+5;
const int maxm=2e5+5; 
const int inf=0x7fffffff-1;
int n,m,k,c;
map<pair<int,int>,bool > mp;
struct Edge{
	int v,next,w;
}edge[maxm<<1];
int cnt,head[maxn],vis[maxn],dis[25][maxn],f[25][(1<<20)+5],mus[25];
struct cc{
	int v,next;
}g[1000];//判断重边? 
int cnt1,head1[maxn];
void add(int u,int v,int w){
	edge[++cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
void ad(int u,int v){
	g[++cnt1].v=v;
	g[cnt].next=head1[u];
	head1[u]=cnt1;
}
struct qnode{
	int v,dis;
	friend bool operator < (qnode x,qnode y){
		return x.dis>y.dis;//
	}
};
void dij(int x){
	priority_queue<qnode> q;
	for(int i=1;i<=n;i++) dis[x][i]=inf;
	dis[x][x]=0; 
	q.push((qnode){x,0});
	while(!q.empty()){
		qnode temp=q.top();
		q.pop();
		int u=temp.v;
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].v;
			if(!vis[v]&&dis[x][v]>dis[x][u]+edge[i].w){
				dis[x][v]=dis[x][u]+edge[i].w;
				q.push((qnode){v,dis[x][v]});
			}
		}
	}
	
}
bool ok(int x){//是否符合要求 
	int num=2;
	int stan=x;
	while(x){
		if((x&1)==1){
			if((stan|mus[num])!=stan) return false;
		}
		x>>=1;
		num++;
	}
	return true;
}
int sure[25];
int dfs(int x){//通过一棵树从下向上遍历求一下限制条件的状态s 
	if(sure[x]) return mus[x];
	if(head1[x]==0) return 1<<(x-2);
	for(int i=head1[x];i;i=g[i].next){
		int v=g[i].v;
		mus[x]|=dfs(v);
	}
	sure[x]=1;
	return mus[x];
}
int nonin[25];//入度为0的点的编号 
int main(){
	cin>>n>>m>>k;
	int u,v,w;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);//lld
		if(mp[make_pair(u,v)]!=1){
			add(u,v,w);
			add(v,u,w); 
		}
		mp[make_pair(u,v)]=1;
	
	}
	cin>>c;
	int x,y;
	for(int i=1;i<=c;i++){
		scanf("%d%d",&x,&y);
		mus[y]|=(1<<(x-2));
		nonin[x]=1;
		if(mp[make_pair(x,y)]!=1){
			ad(y,x);
		}
		mp[make_pair(x,y)]=1;
	}
	for(int i=2;i<=k+1;i++){
		if(!nonin[i]){
			dfs(i);
		}
	}
	for(int i=1;i<=k+1;i++){
		memset(vis,0,sizeof vis);
		dij(i);
	}
	for(int i=1;i<=k+1;i++){
		for(int j=0;j<=((1<<k)-1);j++){
			f[i][j]=inf;
		}
	}
	for(int i=2;i<=k+1;i++){
		f[i][(1<<(i-2))]=dis[1][i];
	}
	int minn=inf;
	for(int j=1;j<=((1<<k)-1);j++){
		//if((j&mus[i])!=j) continue;//
		if(!ok(j)) continue;
			for(int l=2;l<=k+1;l++){
			//if(j&(1<<(l-2))) continue;//可不加 
			if(f[l][j]==inf) continue;
			for(int i=2;i<=k+1;i++){
					if(i==l) continue;
				if((mus[i]|j)==j)
				f[i][j|(1<<(i-2))]=min(f[i][j|(1<<(i-2))],f[l][j]+dis[l][i]); 
			}
		}
	}
	for(int i=2;i<=k+1;i++){
		minn=min(minn,f[i][(1<<k)-1]+dis[i][n]);//k
	}
	cout<<minn<<endl;
	return 0;
}

2022/10/10 20:35
加载中...