CF17B Hierarchy

来源:互联网 发布:视频剪切软件中文版 编辑:程序博客网 时间:2024/04/29 19:32

注意到只有q更大的人才能成为q较小的人的父节点,所以整个树的根节点一定是q最大的那个人。

把所有人按q从大到小排序,每次加入到图中q最大的人,因为所有q比他大的人都已经加入到图中,所以所有有可能成为其父节点的人都在图中了。反言之,如果图中存在可能成为其父节点的人,则计算其中cost最小的那个加入到ans中,反之如果不存在,则无解,ans=-1。


#include <cstdio>#include <cstring>#include <cctype>#include <cstdlib>#include <ctime>#include <climits>#include <cmath>#include <iostream>#include <string>#include <vector>#include <set>#include <map>#include <list>#include <queue>#include <stack>#include <deque>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 1010;struct Node{    int q,id;    bool operator<(const Node &o) const    {        return q>o.q;    }};struct Edge{    int v,d;    Edge(int v,int d):v(v),d(d){}};int n,m;Node a[maxn];vector<Edge> g[maxn];bool vis[maxn];int ans;int main(){    while (scanf("%d",&n)==1)    {        for (int i=1;i<=n;i++)        {            scanf("%d",&a[i].q);            a[i].id=i;        }        scanf("%d",&m);        while (m--)        {            int u,v,c;            scanf("%d%d%d",&u,&v,&c);            g[v].push_back(Edge(u,c));        }        sort(a+1,a+n+1);        memset(vis,0,sizeof(vis));        ans=0;        vis[a[1].id]=1;        for (int i=2;i<=n;i++)        {            int u=a[i].id, mm=INF;            for (int j=0;j<g[u].size();j++)            {                int v=g[u][j].v, d=g[u][j].d;                if (vis[v]) mm=min(mm,d);            }            if (mm==INF) {ans=-1; break;}            ans+=mm;            vis[u]=1;        }        printf("%d\n",ans);    }return 0;}


原创粉丝点击