#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll INFF=0x3f3f3f3f3f3f3f3f;
struct node1
{
ll x,y,r,c;
}node[1010];
ll dis(int i,int j)
{
return (node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y);
}
int n;
int vis[1010];
vector<int> vec[1010],mapp[1010],vs;
void add(int x,int y)
{
vec[x].push_back(y);
mapp[y].push_back(x);
}
int use[1010],cmp[1010];
int cost[1010];
void dfs(int x)
{
use[x]=1;
for(int i=0;i<vec[x].size();i++)
{
if(use[vec[x][i]]==0)
{
dfs(vec[x][i]);
}
}
vs.push_back(x);
}
void rdfs(int x,int id)
{
use[x]=1;
cmp[x]=id;
cost[id]=min((ll)cost[id],node[x].c);
for(int i=0;i<mapp[x].size();i++)
{
if(use[mapp[x][i]]==0)
{
rdfs(mapp[x][i],id);
}
}
}
int scc()
{
memset(use,0,sizeof(use));
vs.clear();
for(int i=1;i<=n;i++)
{
if(!use[i])
dfs(i);
}
memset(use,0,sizeof(use));
int k=1;
for(int i=vs.size()-1;i>=0;i--)
{
if(use[vs[i]]==0)
rdfs(vs[i],k++);
}
//printf("%d\n",k-1);
return k-1;
}
int in[1010];
int main()
{
int t;scanf("%d",&t);
for(int v=1;v<=t;v++)
{
memset(cost,INF,sizeof(cost));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
vec[i].clear();
mapp[i].clear();
}
vs.clear();
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld%lld",&node[i].x,&node[i].y,&node[i].r,&node[i].c);
node[i].r*=node[i].r;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
ll dd=dis(i,j);
if(dd<=node[i].r)
add(i,j);
}
}
}
printf("Case #%d: ",v);
int ppp=scc();
// for(int i=1;i<=ppp;i++)
// {
// printf("%d\n",cost[i]);
// }
for(int i=1;i<=n;i++)
{
for(int j=0;j<vec[i].size();j++)
{
int v=vec[i][j];
if(cmp[i]!=cmp[v])
{
in[cmp[v]]++;
}
}
}
ll ans=0;
for(int i=1;i<=ppp;i++)
{
//printf("%d\n",in[i]);
if(!in[i])
ans+=cost[i];
}
printf("%lld\n",ans);
}
return 0;
}
强连通缩点,求最小价值!hdu5934
最新推荐文章于 2017-08-16 18:09:40 发布