调不动了,46分WA+RE迷惑求助
查看原帖
调不动了,46分WA+RE迷惑求助
106738
_Felix楼主2020/9/28 18:29

我的删边非常诡异,但是应该是对的

调了很久了,望大佬指正

1、2、4、10WA,9RE

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int n,m,k,cnt,vis[N],ct[N];
int hd[N],to[N<<1],val[N<<1],nxt[N<<1];
long long dis[N];
vector<int>vec1[N],vec2[N];
void add(int u,int v,int w){
	to[++cnt]=v;val[cnt]=w;
	nxt[cnt]=hd[u];hd[u]=cnt;
}
struct pos{
	int id,dist;
	bool operator < (const pos x) const {
		return dist>x.dist;
	}
};
void dij(int s,int t){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	priority_queue<pos>q;
	dis[s]=0;q.push((pos){s,0});
//	cout<<"dij: "<<s<<endl;
	while(!q.empty()){
		pos nw=q.top();q.pop();
		int u=nw.id;
		if(vis[u]) continue;
		vis[u]=1;
		if(u>n&&u!=s&&u!=t) continue;
		//cout<<u<<"*"<<dis[u]<<endl;
		if(s<t){
			for(int i=0;i<vec1[u].size();i++){
				int v=vec1[u][i];
		//	if(s==9||s==10)	cout<<"    v"<<v<<endl;
				if(v!=s&&dis[v]>dis[u])
					dis[v]=dis[u],
					q.push((pos){v,dis[v]});
			}
		} else {
			for(int i=0;i<vec2[u].size();i++){
				int v=vec2[u][i];
			//	if(s==9||s==10)	cout<<"    v"<<v<<endl;
				if(v!=s&&dis[v]>dis[u])
				dis[v]=dis[u],
				q.push((pos){v,dis[v]});
			}
		}
		for(int i=hd[u];i;i=nxt[i]){
			int v=to[i];
			//	if(s==9||s==10)	cout<<"    v"<<v<<endl;
			if(dis[v]>dis[u]+val[i])
				dis[v]=dis[u]+val[i],
				q.push((pos){v,dis[v]});
		}
	}
	return;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&n,&m,&k);
		cnt=0;
		memset(hd,0,sizeof(hd));
		memset(nxt,0,sizeof(nxt));
		memset(to,0,sizeof(to));
		memset(val,0,sizeof(val));
		
		for(int i=1,u,v,w;i<=m;i++)
			scanf("%d%d%d",&u,&v,&w),add(u,v,w);
		for(int i=1;i<=k;i++) scanf("%d",&ct[i]);
		long long ans=5e18;
		for(int i=0;(1<<i)<=n;i++){
			for(int j=1;j<=n;j++) vec1[j].clear(),vec2[j].clear();
			int s=n+2*i+1,t=s+1;
		//	cout<<"new: "<<"i: "<<i<<" "<<(1<<i)<<endl;
			for(int j=1;j<=k;j++){
				if(ct[j]&(1<<i)) vec1[s].push_back(ct[j]),vec2[ct[j]].push_back(s);
				else vec2[t].push_back(ct[j]),vec1[ct[j]].push_back(t);
			}
			dij(s,t);//cout<<"dis: "<<dis[t]<<endl;
			ans=min(dis[t],ans); 
		//	cout<<"---"<<endl;
			dij(t,s);//cout<<"dis: "<<dis[s]<<endl;
			ans=min(dis[s],ans); 
		}
		printf("%lld\n",ans);
	} 
	return 0;
} 
2020/9/28 18:29
加载中...