马蜂良好,求卡常
查看原帖
马蜂良好,求卡常
753640
封禁用户楼主2024/6/9 15:13

是其他正常代码时间的 2∼32\sim 3 倍,求卡常。

#include<bits/stdc++.h>
#define sd std::
#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=2e6+10;
int n,m,k;
struct node
{
	int nex;
	int to;
	int dis;
}a[N<<1];
int tp[N];
int head[N],tot;
void add(int u,int v,int w)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
	a[tot].dis=w;
}
struct data
{
	int u,d;
	bool operator<(const data& b) const
	{
		return d>b.d;
	}
};
//s为 n+1,t为 n+2 
int dis[N];
int dij(int s,int t)
{
	sd priority_queue<data> q;
	me(dis,127);
	dis[s]=0;
	q.push({s,0});
	while(!q.empty())
	{
		auto [u,d]=q.top();q.pop();
		if(d!=dis[u]) continue;
		for(int i=head[u];i;i=a[i].nex)
		{
			int v=a[i].to,w=a[i].dis;
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				q.push({v,dis[v]});
			}
		}
	}
	return dis[t];
}
il void init()
{
	tot=0;
	me(head,0);
}
int d[N];//目标 
il void solve()
{
	n=read(),m=read(),k=read();
	F(i,1,m)
	{
		int x=read(),y=read(),z=read();
		if(x!=y) add(x,y,z);
	}
	F(i,1,k) d[i]=read();
	int s=n+1,t=n+2,ans=linf;
	F(i,1,n+3) tp[i]=head[i];
	for(int i=0;(i<<1)<=k;i++)
	{
		int p=tot;
		F(j,1,k)
		{
			if(j&(1<<i)) add(s,d[j],0);
			else add(d[j],t,0);
		}
		ans=MIN(ans,dij(s,t));
		tot=p;
		F(j,1,n+3) head[j]=tp[j];
		F(j,1,k)
		{
			if(j&(1<<i)) add(d[j],t,0);
			else add(s,d[j],0);
  		}
  		tot=p;
		ans=MIN(ans,dij(s,t));
		F(j,1,n+3) head[j]=tp[j];
	}
	put(ans);
	init();
}
signed main()
{
	int T;
	T=read();
	while(T--) solve();
    return 0;
}



2024/6/9 15:13
加载中...