蜜汁超时??
查看原帖
蜜汁超时??
56646
jun君楼主2021/8/10 10:25
#include<iostream>
#include<fstream>
#include<cstdio>
#include<queue>
#include<algorithm> 
#include<cstring>
using namespace std;
long long inline read(){
	char a;long long now=0;
	a=getchar();
	while (a<'0'||a>'9')a=getchar();
	while ('0'<=a&&a<='9')now=(now<<1)+(now<<3)+a-'0',a=getchar();
	return now;
}
struct st{
	long long dis,to,next;
}edge[400010];
struct st2{
	long long id,x;
}b[200010];
long long cnt,f[200010],hd[200010],x,y,z,n,m,now,minn,s;
bool vis[200010],r[200010];
struct tmp
{
    bool operator() (long long a,long long b) 
    {
        return f[a] < f[b];
    }
};
void add_edge(long long u,long long v,long long dis){
	edge[++cnt].next=hd[u];
	edge[cnt].to=v;
	edge[cnt].dis=dis;
	hd[u]=cnt;return ;
}
void dij(){
	priority_queue <tmp,vector<long long>,less<long long> > q;
	for (int i=1;i<=n;i++)q.push(i),vis[i]=true;
	while (!q.empty()){
		now=q.top();q.pop();
		vis[now]=0;
		r[now]=true;
		for (long long i=hd[now];i;i=edge[i].next){
			if (f[now]+edge[i].dis<f[edge[i].to]){
				f[edge[i].to]=f[now]+edge[i].dis;
//				printf("!!%d %d %d %d %d\n",now,edge[i].to,edge[i].dis,f[now],f[edge[i].to]);
				if (!vis[edge[i].to])q.push(edge[i].to),vis[edge[i].to]=true;
			}
		}
	}
}
int main(){
	n=read();m=read();
	minn=1e9;
	for (int i=1;i<=m;i++){
		x=read();y=read();z=read();
		if (z*2>=1000000000000ll)continue;
		add_edge(x,y,z*2);
		add_edge(y,x,z*2); 
	}
	for (int i=1;i<=n;i++){
		scanf("%lld",&f[i]);
	}
	dij();
	for (int i=1;i<=n;i++){
		printf("%lld ",f[i]);
	}
	return 0;
} 
2021/8/10 10:25
加载中...