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;
}