这题直接清除原图后把方向相反为什么不行
查看原帖
这题直接清除原图后把方向相反为什么不行
835942
jntm233楼主2024/10/15 21:00
	ll n,m;cin>>n>>m;
	map<ll,vector<pll>>ve;
	priority_queue<pll>qq;
	vector<ll>dist(n+1,inf);
	vector<array<ll,3>>acm;
	rep(i,1,m){
		ll u,v,w;cin>>u>>v>>w;
		acm.push_back({u,v,w});
		ve[u].push_back({v,w});
	}
	auto dj=[&](ll x)->void{
//		cout<<"\n"<<x<<":\n";
		dist.resize(n+1,inf);
		while(qq.size())qq.pop();
		map<ll,ll>vis;
		dist[x]=0;
		qq.push({0,x});//存距离和点的编号
		while(qq.size()){
			ll u=qq.top().y;
			qq.pop();
			if(vis[u])continue;
			vis[u]=1;
			for(auto s:ve[u]){//遍历u连接的所有点
				ll v=s.x,w=s.y;
//				cout<<u<<" "<<v<<endl;
				if(dist[v]>dist[u]+w){
					dist[v]=dist[u]+w;
					qq.push({-dist[v],v});
				}
			}
		}
	};
	dj(1);
	ll sum=0;
	rep(i,2,n)sum+=dist[i];
	ve.clear();
	for(auto k:acm){
		ll u=k[0],v=k[1],w=k[2];
		ve[v].push_back({u,w});
	}
	
	ll res=0;
	rep(i,1,n)cout<<dist[i]<<endl;
}
就是算完1到其他的距离后再把原来方向全部相反后再dj(1)一次
2024/10/15 21:00
加载中...