救救孩子吧
查看原帖
救救孩子吧
358793
想不好名字楼主2021/10/4 19:09

一直RE,连样例都过不去,求救

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define int long long

using namespace std;

int n,m,s;
int ans;

struct node {
    int pos;
    int dis;
    node(int POS, int DIS) :  pos(POS), dis(DIS) {}
    bool operator > (const node& o) const { return dis > o.dis; }
};
priority_queue< node, vector<node>, greater<node> > q;
//struct node{
//	int dis,pos;
//	bool operator < (const node &x) const {
//		return x.dis<dis;
//	}
//};
//
//priority_queue< node > q;
struct edge{
	int u,v,w;
}e[500010];
int lk[500500],ltp;
int dis[500500];
void add(int x,int y,int z){
	e[++ltp]={lk[x],y,z};
	lk[x]=ltp;
}
void work(int s){
	for(int i=1;i<=n*2;++i) dis[i]=9000000000000000;
	dis[s]=0;
	q.push((node){0,s});
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int x=tmp.pos,y=tmp.dis;
		if(dis[x]<y) continue;
		for(int i=lk[x];~i;i=e[i].u){
			int v=e[i].v;
			if(dis[v]>y+e[i].w){
				dis[v]=y+e[i].w;
				q.push((node){dis[v],v});
			}
		}
	}
}
signed main(){
	memset(lk,-1,sizeof(lk));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);add(a+n,b+n,c);
	}
	work(1);
	for(int i=2;i<=n<<1;++i) ans=ans+dis[i];
	work(n+1);
	for(int i=n+2;i<=n<<1;++i) ans+=dis[i];
	cout<<ans;
	return 0;
}

2021/10/4 19:09
加载中...