[THOJ 2175] cut

题意

  已知有一张 n 个点的图, 以及两两的最小割, 构造出一张合法的原图.

  n <= 1000 .

分析

  假设存在合法原图, 最小割树即是最小生成树.

  求出最小生成树, 判定任意点对间是否满足, 然后再输出最小割树即可.

实现

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cctype>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 #define F(i,a,b) for (int i=(a);i<=(b);i++)
 8
 9 const int N=105;
10 const int L=10005;
11 const int E=205;
12 const int INF=~0u>>1;
13
14 int n;
15 int p[N][N];
16
17 int m;
18 struct Ed {
19     int u,v,d;
20     inline Ed(int _u=0,int _v=0,int _d=0):u(_u),v(_v),d(_d){}
21     friend inline int operator < (Ed a,Ed b) {
22         return a.d>b.d;
23     }
24 }ed[L];
25
26 int f[N];
27 struct Graph {
28     int v,d,nx;
29     inline Graph(int _v=0,int _d=0,int _nx=0):v(_v),d(_d),nx(_nx){}
30 }mp[E];
31 int tot,hd[N];
32
33 int dis[N][N];
34
35 inline int rd(void) {
36     int x=0,f=1; char c=getchar();
37     for (;!isdigit(c);c=getchar()) if (c==‘-‘) f=-1;
38     for (;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
39     return x*f;
40 }
41
42 int Find(int x) {
43     if (f[x]==x) return x;
44     else return f[x]=Find(f[x]);
45 }
46 inline void Ins(int u,int v,int d) {
47     mp[++tot]=Graph(v,d,hd[u]); hd[u]=tot;
48     mp[++tot]=Graph(u,d,hd[v]); hd[v]=tot;
49 }
50
51 void DFS(int *a,int x,int pre) {
52     for (int k=hd[x];k>0;k=mp[k].nx)
53         if (mp[k].v!=pre) {
54             a[mp[k].v]=min(a[x],mp[k].d);
55             DFS(a,mp[k].v,x);
56         }
57 }
58
59 int main(void) {
60     #ifndef ONLINE_JUDGE
61         freopen("sdchr.in","r",stdin);
62         freopen("sdchr.out","w",stdout);
63     #endif
64
65     cin>>n; F(i,1,n) F(j,1,n) p[i][j]=rd(); F(i,1,n) p[i][i]=INF;
66
67     F(i,1,n) F(j,1,n)
68         ed[++m]=Ed(i,j,p[i][j]);
69     sort(ed+1,ed+m+1);
70     F(i,1,n) f[i]=i; tot=1;
71     F(i,1,m) {
72         int u=ed[i].u,v=ed[i].v,d=ed[i].d;
73         int fu=Find(u),fv=Find(v);
74         if (fu!=fv) {
75             Ins(u,v,d);
76             f[fu]=fv;
77         }
78     }
79
80     F(i,1,n) {
81         dis[i][i]=INF;
82         DFS(dis[i],i,-1);
83     }
84     F(i,1,n) F(j,1,n) if (dis[i][j]!=p[i][j]) {
85         printf("-1\n"); return 0;
86     }
87     cout<<n-1<<endl;
88     for (int i=2;i<=tot;i+=2) {
89         int x=mp[i].v,y=mp[i^1].v,d=mp[i].d;
90         printf("%d %d %d\n",x,y,d);
91     }
92
93     return 0;
94 }
时间: 2024-10-18 03:50:47

[THOJ 2175] cut的相关文章

shell脚本的使用---cut截取数据

linux之cut命令的用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-10-03 我要评论 cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的 (1)其语法格式为: cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出. 如果不指定 Fi

HDU 5452 Minimum Cut

Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 315    Accepted Submission(s): 120 Problem Description Given a simple unweighted graph G (an undirected graph containing no loops nor

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点X上的权值变成Y. 输入输出格式 输入格式: 第1行两个整数,分别为N和M,代表点数和操

Cut

cut定义: 正如其名,cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的. 剪切依据: cut命令主要是接受三个定位方法: 第一,字节(bytes),用选项-b 第二,字符(characters),用选项-c 第三,域(fields),用选项-f 语法格式: cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明: cut 命令从文件的每一行剪切字

工具之cut

转自http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html cut:正如其名就是"剪",和sed一样,一行为单位,对数据进行剪辑. (1)语法格式:cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须

shell基础(二)cut用法

语法: cut -d '分隔字符' [-cf] n -d 后面指定分隔符,单引号引起来,必须是单个字符 -f 指定第几段,可以跟多个数字,用逗号隔开 -c 后面只有一个数字,表示截取第几个字符 -d 后面跟分隔字符,这里使用冒号:作为分隔字符,-f 1 就是截取第一段. 注意:-f 和 1直接的空格可有可无.     -d 和 -c 不能同时使用 # cut -d ':' -f 3 /etc/passwd [空格之后用单引号引起来] # cut -d:-f 3 /etc/passwd  [-d

Linux命令篇之cut命令和join命令

cut命令的用法 cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的 (1)其语法格式为:cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要参数-b

cut命令

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要参数-b :以字节为单位进

图像分割之(二)Graph Cut(图割)

[email protected] http://blog.csdn.net/zouxy09 上一文对主要的分割方法做了一个概述.那下面我们对其中几个比较感兴趣的算法做个学习.下面主要是Graph Cut,下一个博文我们再学习下Grab Cut,两者都是基于图论的分割方法.另外OpenCV实现了Grab Cut,具体的源码解读见博文更新.接触时间有限,若有错误,还望各位前辈指正,谢谢. Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image se