Cod sursa(job #1839370)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 2 ianuarie 2017 20:31:54
Problema Componente biconexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int nmax=3000,mmax=5000;
int cost[nmax+5],st[nmax+5],ls,lv[nmax+5],up[nmax+5],nc;
vector<int> ve[nmax+5],co[nmax+5];
void baga(int x,int y)
{
    nc++;
    while(st[ls]!=y)
    {
        co[nc].push_back(st[ls]);
        ls--;
    }
    co[nc].push_back(st[ls]);
    co[nc].push_back(x);
    ls--;
}
void dfs(int x)
{
    up[x]=lv[x];
    ls++;
    st[ls]=x;
    int i;
    for(i=ve[x].size()-1; i>=0; i--)
        if(lv[ve[x][i]]==0)
        {
            lv[ve[x][i]]=lv[x]+1;
            dfs(ve[x][i]);
            if(up[x]>up[ve[x][i]])
                up[x]=up[ve[x][i]];
            if(up[ve[x][i]]==lv[x])
                baga(x,ve[x][i]);
        }
        else
        {
            if(lv[ve[x][i]]<up[x])
                up[x]=lv[ve[x][i]];
        }

}
bool cmp(int a,int b)
{
    return cost[a]<cost[b];
}
pair<long long,int > li[nmax+5];
int main()
{
    freopen("lianyu.in","r",stdin);
    freopen("lianyu.out","w",stdout);
    int n,k,m,i,j,x,y;
    long long sc,sb=-1;
    nc=ls=0;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1; i<=n; i++)
        scanf("%d",&cost[i]);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&x,&y);
        ve[x].push_back(y);
        ve[y].push_back(x);
    }
    lv[1]=1;
    dfs(1);
    for(i=1;i<=nc;i++)
    {
        sort(co[i].begin(),co[i].end(),cmp);
   //    for(j=co[i].size()-1;j>=0;j--)
     //      printf("-%d ",co[i][j]);
       //    printf("\n");
        if(co[i].size()>=k)
        {
            sc=0;
            for(j=0;j<k;j++)
            sc=sc+cost[co[i][j]];
        if(sc<sb || sb==-1)
            sb=sc;
        }
    }
    printf("%lld\n",sb);
    return 0;
}