Pagini recente » Cod sursa (job #2837375) | Cod sursa (job #332319) | Cod sursa (job #2581269) | Cod sursa (job #1100928) | Cod sursa (job #2339312)
#include <iostream>
#include <fstream>
#include <vector>
#define N 5005
#define mod 1000000021
#define node vecini[x][i]
#define act comp[i][j]
#include <algorithm>
using namespace std;
struct ks{
long long k;
long long val;
}v[N],aux;
long long t,n,m,k,x,y,l,nr;
long long b[N],dp[205],rez;
bool seen[N],a[N][N];
vector<long long>vecini[N],comp[N];
void reset()
{
rez=l=nr=0;
for(long long i=0;i<=n;++i) v[i].val=v[i].k=b[i]=dp[i]=seen[i]=0;
for(long long i=0;i<=n;++i)
{
vecini[i].resize(0);
comp[i].resize(0);
for(long long j=0;j<=n;++j) a[i][j]=0;
}
n=m=k=x=y=0;
}
void dfs(long long r,long long x)
{
seen[x]=1; a[r][x]=1;
for(long long i=0;i<vecini[x].size();++i) if(!seen[node]) dfs(r,node);
}
void CTC()
{
for(long long i=1;i<=n;++i) if(!seen[i])
{
++l;
for(long long j=1;j<=n;++j) if(a[i][j]==a[j][i] && a[i][j]==1) comp[l].push_back(j), seen[j]=1;
}
}
bool Comp(ks aa,ks bb){return(aa.val<bb.val);}
///stii cum ii spui la un rucsac pus pe un scaun?
void ghiozDanSpataru()
{
for(long long i=1;i<=l;++i)
{
m=comp[i].size(); nr=0;
for(int j=0;j<=m;++j) v[i]=aux;
for(long long j=0;j<m;++j) v[j+1].val=b[act], v[j+1].k=1;
sort(v+1,v+m+1,Comp);
for(long long j=1;j<=m;++j)
{
if(v[j].val!=v[nr].val) v[++nr]=v[j];
else v[nr].k+=v[j].k;
}
for(long long j=1;j<=nr;++j)
{
v[j].k+=v[j-1].k;
//cout<<v[j].val<<' '<<v[j].k<<endl;
}
for(long long j=k;j>=0;--j)
{
for(int o=0;o<=nr;++o) if(j-v[o].k>=0 && (dp[j-v[o].k] || j-v[o].k==0))
{
dp[j]=max(dp[j],dp[j-v[o].k]+(v[o+1].val)*(m-v[o].k));
}
}
// for(long long j=0;j<=k;++j) cout<<dp[j]<<' ';
// cout<<endl;
}
for(long long i=0;i<=k;++i) rez=max(rez,dp[i]);
cout<<rez%mod<<'\n';
}
int main()
{
ios_base::sync_with_stdio(false);
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
// cin>>t; ++t;
// while(--t)
{
cin>>n>>m>>k;
for(long long i=1;i<=n;++i) cin>>b[i];
for(long long i=1;i<=m;++i) cin>>x>>y, vecini[x].push_back(y);
///matricea in/out
for(long long i=1;i<=n;++i)
{
dfs(i,i);
for(long long j=1;j<=n;++j) seen[j]=0;
}
///
CTC();
cout<<l<<'\n';
for(int i=1;i<=l;++i,cout<<'\n') for(int j=0;j<comp[i].size();++j) cout<<comp[i][j]<<' ';
///
//ghiozDanSpataru();
reset();
}
return 0;
}