小翟为了完成一篇论文,一共要抄袭n篇文章。其中第i篇文章需要a[i]的时间去完成。小翟可以发动粉丝同时抄袭多篇文章,但存在一些文章,只有当它的若干个前置文章抄袭完成后,才能开始抄袭该文章。同时我们认为小翟和其粉丝在一篇文章的前置文章都完成后,能马上开始抄袭该文章。为了让小翟尽快完成论文,获得博士学位,在最优的情况下,小翟的论文什么时候可以完成?
小翟虽然不知道知网,但是他想知道在保证论文尽快完成的情况下(即保证上题答案不变情况),每篇文章最早什么时候可以开始抄袭,和最晚什么时候可以开始抄袭。设第i篇文章最早可以抄袭的时间为f[i];在不影响论文完成时间前提下,第i篇文章最晚可以抄袭的时间为g[i]. 请你回答∏i=0-n (g[i]-f[i]+10) 除以10^9+7所得的余数,题目保证有解。
输入:
第一行输入一个整数n,m
第二行输入n个正整数,a1,a2,…,an描述每篇文章抄袭所需要的时间。
接下来读入m行,每行读入两个整数u,v,表示编号为u的文章是编号为v文章的前置文章
所有的输入数据都满足1<=n<=5*10^5,1<=m<=10^6,1<=a[i]<=10^6
输出:
第一行输出一个整数表示论文最早完成时间。
第二行输出一个整数表示∏i=0-n (g[i]-f[i]+10) 除以10^9+7所得的余数
样例输入:
8 9
11 17 16 20 14 12 13 15
1 3
2 4
4 3
3 6
5 6
2 5
6 8
5 7
7 8
样例输出:
80
459599979
备注:
∏i=0-n 为i从0到n的累乘符号
小翟虽然不知道知网,但是他想知道在保证论文尽快完成的情况下(即保证上题答案不变情况),每篇文章最早什么时候可以开始抄袭,和最晚什么时候可以开始抄袭。设第i篇文章最早可以抄袭的时间为f[i];在不影响论文完成时间前提下,第i篇文章最晚可以抄袭的时间为g[i]. 请你回答∏i=0-n (g[i]-f[i]+10) 除以10^9+7所得的余数,题目保证有解。
输入:
第一行输入一个整数n,m
第二行输入n个正整数,a1,a2,…,an描述每篇文章抄袭所需要的时间。
接下来读入m行,每行读入两个整数u,v,表示编号为u的文章是编号为v文章的前置文章
所有的输入数据都满足1<=n<=5*10^5,1<=m<=10^6,1<=a[i]<=10^6
输出:
第一行输出一个整数表示论文最早完成时间。
第二行输出一个整数表示∏i=0-n (g[i]-f[i]+10) 除以10^9+7所得的余数
样例输入:
8 9
11 17 16 20 14 12 13 15
1 3
2 4
4 3
3 6
5 6
2 5
6 8
5 7
7 8
样例输出:
80
459599979
备注:
∏i=0-n 为i从0到n的累乘符号
题目描述:就是拓扑排序的题 但问题不同解法也发生了很大改变 题目要找出每件工作最早和最晚完成的时间;
分析:因为是无环图,所以直接用dfs跑 第一次到达的一定是最早的时间(多次出现取最大(拓扑排序的精髓)),并且可以找出总共工作完成的时间ans,再用ans从尾开始跑一边,取最小这就是最迟完成的时间
#include<bits/stdc++.h>
using namespace std;
const int MAX=5e5+5;
const int mod=1e9+7;
vector<int> mapp[MAX];
vector<int >mapp1[MAX];
int f[MAX],g[MAX];
int value[MAX];
int n,m;
long long ans=0;
int vis[MAX],vis1[MAX];
void dfs(int x){
for(int i=0,sz=mapp[x].size();i<sz;i++){
int v=mapp[x][i];
if(f[v]<f[x]+value[v]) f[v]=f[x]+value[v];
if(f[v]>ans) ans=f[v];
dfs(v);
}
}
void dfs1(int x){
for(int i=0,sz=mapp1[x].size();i<sz;i++){
int v=mapp1[x][i];
if(g[v]>g[x]-value[x]) g[v]=g[x]-value[x];
dfs1(v);
}
}
int main(){
// freopen("1.txt","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>value[i];
value[0]=0;
memset(vis,0,sizeof(vis));
memset(vis1,0,sizeof(vis1));
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
mapp[x].push_back(y);
mapp1[y].push_back(x);
vis[y]=1;
vis1[x]=1;
}
memset(f,0,sizeof(f));
memset(g,0x3f3f3f3f,sizeof(g));
for(int i=1;i<=n;i++)
if(!vis[i]) mapp[0].push_back(i);
for(int i=1;i<=n;i++)
if(!vis1[i]){
mapp1[0].push_back(i);
}
dfs(0);
g[0]=ans;
dfs1(0);
cout<<ans<<endl;
ans=1;
for(int i=1;i<=n;i++)
ans=(ans*(g[i]-f[i]+10))%mod;
cout<<ans<<endl;
}

京公网安备 11010502036488号