description
solution
易知本题所构成的图是若干幅有向无环图,可能存在多个联通块.根据贪心策略,最早时间做完作业即将此作业的所有前置作业做完再做此作业即可.最晚完成某作业即除了此作业的后置作业外其余全部做完再做此作业.故欲求后置作业,我们可以按题目所描述的方式构图然后爆搜查找即可.至于前置作业,我们可以构造一幅反图,然后按照求后置作业的方式继续爆搜即可.
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<ctime>
#define R register
#define next kdjadskfj
#define debug puts("mlg")
#define mod K
#define Mod(x) ((x%mod+mod)%mod)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
inline ll read();
inline void write(ll x);
inline void writeln(ll x);
inline void writesp(ll x);
ll n,m;
ll to[21000],next[21000],head[21000],tot;
inline void add(ll x,ll y){to[++tot]=y;next[tot]=head[x];head[x]=tot;}
ll v[21000];
bool vis[21000];
ll sum;
ll Head[21000],Next[21000],To[21000],Tot;
inline void Add(ll x,ll y){
To[++Tot]=y;Next[Tot]=Head[x];Head[x]=Tot;
}
ll s[2100][2100],len[2100];
inline void dfs1(ll x,ll Fa){
vis[x]=true;
for(R ll i=head[x],ver;i;i=next[i]){
ver=to[i];
if(vis[ver]) continue;
s[Fa][++len[Fa]]=ver;
dfs1(ver,Fa);
}
}
ll c[2100][2100],h[2100];
bool Vis[2100];
inline void dfs2(ll x,ll Fa){
c[Fa][++h[Fa]]=x;
Vis[x]=true;
for(R ll i=Head[x],ver;i;i=Next[i]){
ver=To[i];
if(Vis[ver]) continue;
dfs2(ver,Fa);
}
}
int main(){
n=read();m=read();
for(R ll i=1;i<=n;i++) v[i]=read(),sum+=v[i];
for(R ll i=1,x,y;i<=m;i++){
x=read();y=read();
add(x,y);
Add(y,x);
}
for(R ll i=1;i<=n;i++){
memset(vis,0,sizeof vis);memset(Vis,0,sizeof Vis);
dfs1(i,i);dfs2(i,i);
}
for(R ll i=1;i<=n;i++){
ll ans=0;
for(R ll j=1;j<=h[i];j++) ans+=v[c[i][j]];
writesp(ans);
ans=0;
for(R ll j=1;j<=len[i];j++) ans+=v[s[i][j]];
writeln(sum-ans);
}
}
inline ll read(){ll x=0,t=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*t;}
inline void write(ll x){if(x<0){putchar('-');x=-x;}if(x<=9){putchar(x+'0');return;}write(x/10);putchar(x%10+'0');}
inline void writesp(ll x){write(x);putchar(' ');}
inline void writeln(ll x){write(x);putchar('
');}