Cod sursa(job #2339312)

Utilizator dragos231456Neghina Dragos dragos231456 Data 8 februarie 2019 18:27:25
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.69 kb
#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;
}