Pagini recente » Cod sursa (job #1708927) | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #2757707) | Cod sursa (job #1839370)
#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;
}