#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<climits>
using namespace std;
const int maxn=1e5+7;
const int INF=INT_MAX;
const int MOD=1e9+7;
vector<int>graph[maxn];
int indegree[maxn];
long long early[maxn];
long long last[maxn];
long long time[maxn];
long long criticalpath(int n)
{
vector<int>topo;
queue<int>node;
for(int i=1;i<=n;i++)
{
if(indegree[i]==0)
{
node.push(i);
}
}
long long totaltime=0;
while(!node.empty())
{
int u=node.front();
topo.push_back(u);
node.pop();
for(int i=0;i<graph[u].size();++i)
{
int v=graph[u][i];
early[v]=max(early[v],early[u]+time[u]);
indegree[v]--;
if(indegree[v]==0)
{
node.push(v);
totaltime=max(totaltime,early[v]+time[v]);
}
}
}
for(int i=topo.size()-1;i>=0;--i)
{
int u=topo[i];
if(graph[u].size()==0)
{
last[u]=totaltime-time[u];
}else
{
last[u]=INT_MAX;
}
for(int j=0;j<graph[u].size();++j)
{
int v=graph[u][j];
last[u]=min(last[u],last[v]-time[u]);
}
}
return totaltime;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(graph,0,sizeof(graph));
memset(early,0,sizeof(early));
memset(last,0,sizeof(last));
memset(time,0,sizeof(time));
for(int i=1;i<=n;++i)
{
scanf("%lld",&time[i]);
}
while(m--!=0)
{
int from,to;
scanf("%d%d",&from,&to);
graph[from].push_back(to);
indegree[to]++;
}
long long totaltime=criticalpath(n);
long long answer=1;
for(int i=1;i<=n;++i)
{
answer*=last[i]-early[i]+1;
answer%=MOD;
}
printf("%lld\n%lld\n",totaltime,answer);
}
return 0;
}
07-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交