what_should_i_do
查看原帖
what_should_i_do
142549
hbhz_zcy楼主2022/7/29 22:07

more and more vegetables,what should i do

rt,正解方法做的,现在拍小数据拍不出来,调了3h,还是做不出来!!

//g++ d.cpp -g -o d -std=c++14 -O0 -Wall
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=2e5+10,maxh=1e9+10;
int N,M1,M2,S,head[maxn],d[maxn],vis[maxn],nume=0,intop=0,du[maxn],b[maxn],st[maxn],stop=0;
struct node{int to,nxt,dis;}e[maxn<<1],in[maxn];
struct nodeq{int id,v;};
priority_queue<nodeq>q;
bool operator<(const nodeq &x,const nodeq &y){return x.v>y.v;}
void edgen(int from,int to,int dis){
	e[++nume].nxt=head[from];
	head[from]=nume;
	e[nume].to=to;
	e[nume].dis=dis;
}
int qd(){
	int rt=0,ng=0;char c=getchar();
	while(c<'0'||c>'9')  ng|=(c=='-'),c=getchar();
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return ng?-rt:rt;
}
void dij(int t){
	q.push((nodeq){t,d[t]});
	while(!q.empty()){
		nodeq t=q.top();q.pop();if(t.v!=d[t.id])  continue;
		int u=t.id;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(d[u]+e[i].dis<d[v]){
				d[v]=d[u]+e[i].dis;
				if(e[i].dis>=0)  q.push((nodeq){v,d[v]});
			}
		}
	}
//	for(int i=1;i<=N;i++)  printf("%d\n",d[i]);
//	putchar('\n');
}
int fa(int t){return t==b[t]?t:b[t]=fa(b[t]);}
void dfs(int u){
//	printf("dfs %d\n",u);
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(e[i].dis<0)  st[++stop]=v,du[fa(v)]++;
		else if(!vis[v])  dfs(v);
	}
}
int main(){
	freopen("in.txt","r",stdin);
	N=qd(),M1=qd(),M2=qd(),S=qd();
	for(int i=1;i<=N;i++)  b[i]=i;
	for(int i=1;i<=M1;i++){
		int x=qd(),y=qd(),z=qd();
		edgen(x,y,z),edgen(y,x,z);
		b[fa(x)]=fa(y);
	}
	for(int i=1;i<=M2;i++){
		int x=qd(),y=qd(),z=qd();
		edgen(x,y,z);
	}
	for(int i=1;i<=N;i++)  d[i]=maxh;
	d[S]=0;dij(S);dfs(S);
	while(stop){
		int t=st[stop--];
		if(--du[fa(t)]<=0){dij(t);dfs(t);}
	}
	for(int i=1;i<=N;i++){
		if(d[i]==maxh)  printf("NO PATH\n");
		else printf("%d\n",d[i]);
	}
	return 0;
}
2022/7/29 22:07
加载中...