WA on #2 求调
查看原帖
WA on #2 求调
511959
_Weslie_楼主2024/7/19 17:12

rt。

#include<bits/stdc++.h>
using namespace std;
struct edge{
	int u,v,w,nxt,pos;
}e[500005];
struct node{
	int dis,pos,flag=0,lpos;
	bool operator <(const node &x)const{
		return x.dis<dis;
	}
};
int head[100005],cnt;
long long dis[100005];
bool vis[100005];
int n,m,s;
int k,t;
void add(int u,int v,int w,int o){
	e[++cnt].u=u;
	e[cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	e[cnt].pos=o;
	head[u]=cnt;
}
priority_queue<node>q;
long long read() {
	int f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
node p;
void dj(){
	p.dis=0;
	p.pos=1;
	p.flag=0;
	q.push(p);
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.pos,y=tmp.dis;
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].nxt){
			int v=e[i].v;
			if(!tmp.flag&&e[i].pos==1)continue;
			if(tmp.flag&&e[i].pos==0)continue;
			if(tmp.lpos!=e[i].pos&&x!=1)p.flag=1;
			else p.flag=0;
			if(dis[v]>dis[x]+e[i].w){
				dis[v]=dis[x]+e[i].w;
				if(!vis[v]){
					p.dis=dis[v];
					p.pos=v;
					p.lpos=tmp.pos;
					q.push(p);
				}
			}
		}
	}
}
int u[200005],v[200005],w[200005];
int main(){
	n=read();
	m=read();
	for(int i=1;i<=m;i++){
		u[i]=read();
		v[i]=read();
		w[i]=read();
		add(u[i],v[i],w[i],0);
		add(v[i],u[i],w[i],1);
	}
	for(int i=1;i<=n;i++)dis[i]=1145141919810;
	dis[1]=0;
	dj();
	cnt=1;
	memset(vis,0,sizeof(vis));
	memset(head,0,sizeof(head));
	for(int i=1;i<=m;i++){
		add(u[i],v[i],w[i],1);
		add(v[i],u[i],w[i],0);
	}
	dj();
	for(t=2;t<=n;t++){
		if(dis[t]!=1145141919810)printf("%lld ",dis[t]);
		else printf("-1 ");
	}
	return 0;
}
2024/7/19 17:12
加载中...