cf div2 234 D
2 seconds
256 megabytes
standard input
standard output
Dima took up the biology of bacteria, as a result of his experiments, he invented k types of bacteria. Overall, there are n bacteria at his laboratory right now, and the number of bacteria of type i equals ci. For convenience, we will assume that all the bacteria are numbered from 1 to n. The bacteria of type ci are numbered from
to
.
With the help of special equipment Dima can move energy from some bacteria into some other one. Of course, the use of such equipment is not free. Dima knows m ways to move energy from some bacteria to another one. The way with number i can be described with integers ui, vi and xi mean that this way allows moving energy from bacteria with number ui to bacteria with number vi or vice versa for xi dollars.
Dima's Chef (Inna) calls the type-distribution correct if there is a way (may be non-direct) to move energy from any bacteria of the particular type to any other bacteria of the same type (between any two bacteria of the same type) for zero cost.
As for correct type-distribution the cost of moving the energy depends only on the types of bacteria help Inna to determine is the type-distribution correct? If it is, print the matrix d with size k × k. Cell d[i][j] of this matrix must be equal to the minimal possible cost of energy-moving from bacteria with type i to bacteria with type j.
The first line contains three integers n, m, k (1 ≤ n ≤ 105; 0 ≤ m ≤ 105; 1 ≤ k ≤ 500). The next line contains k integers c1, c2, ..., ck (1 ≤ ci ≤ n). Each of the next m lines contains three integers ui, vi, xi (1 ≤ ui, vi ≤ 105; 0 ≤ xi ≤ 104). It is guaranteed that
.
If Dima's type-distribution is correct, print string «Yes», and then k lines: in the i-th line print integers d[i][1], d[i][2], ..., d[i][k] (d[i][i] = 0). If there is no way to move energy from bacteria i to bacteria j appropriate d[i][j] must equal to -1. If the type-distribution isn't correct print «No».
4 4 2
1 3
2 3 0
3 4 0
2 4 1
2 1 2
Yes
0 2
2 0
3 1 2
2 1
1 2 0
Yes
0 -1
-1 0
3 2 2
2 1
1 2 0
2 3 1
Yes
0 1
1 0
3 0 2
1 2
No 好吧,cf第四道居然这么水,虽然死长死长的,每个类型中取一个点深搜只走权为0的路,然后判断能不能覆盖同类型的所有点即可判断,然后更新dis[i][j] ( 1<=i<= k, 1<=j<=k)的值,走一次floyd即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std; #define maxn 100005 int n,m,k;
int c[],first[maxn],next[ * maxn],v[ * maxn],x[ * maxn],dis[][],u1[ * maxn];
bool flag = ;
bool vis[maxn]; void addedge(int a,int b,int id) {
int e = first[a];
next[id] = e;
first[a] = id;
} void dfs(int u,int type) {
vis[u] = ;
//printf("u = %d type = %d\n",u,type);
for(int e = first[u]; e != -; e = next[e]) {
if(!vis[ v[e] ] && x[e] == ) {
dfs(v[e],type);
}
}
}
void solve() {
for(int i = ; i <= k; i++) {
memset(vis,,sizeof(vis));
dfs(c[i],i); for(int j = c[i - ] + ; j <= c[i]; j++) {
if(!vis[j]) {
flag = ;
//printf(" i = %d\n",i);
return;
}
} }
} void floyd() {
for(int p = ; p <= k; p++) {
for(int i = ; i <= k; i++) {
for(int j = ; j <= k; j++) {
if(dis[i][p] != - && dis[p][j] != -) {
dis[i][j] = dis[i][j] == - ? dis[i][p] + dis[p][j] :
min(dis[i][j],dis[i][p] + dis[p][j]);
}
}
}
}
}
void output() {
if(flag) {
printf("Yes\n"); for(int i = ; i < * m; i += ) {
int id1,id2;
id1 = lower_bound(c + ,c + k + ,u1[i]) - c;
id2 = lower_bound(c + ,c + k + ,v[i]) - c;
if(id1 == id2) continue;
dis[id1][id2] = dis[id2][id1] = dis[id1][id2] == - ?
x[i] : min(dis[id1][id2],x[i]);
} floyd(); for(int i = ; i <= k; i++) {
for(int j = ; j <= k; j++) {
printf("%d",dis[i][j]);
if(j != k) printf(" ");
}
printf("\n");
}
} else {
printf("No\n");
}
} int main() { freopen("sw.in","r",stdin); scanf("%d%d%d",&n,&m,&k); for(int i = ; i <= k; i++) {
scanf("%d",&c[i]);
} for(int i = ; i <= k; i++) {
c[i] += c[i - ];
} for(int i = ; i <= k; i++) {
for(int j = ; j <= k; j++) {
if(i == j) dis[i][j] = ;
else dis[i][j] = -;
}
} for(int i = ; i <= n; i++) first[i] = -; for(int i = ; i < * m; i = i + ) {
int a,b,w;
scanf("%d%d%d",&u1[i],&v[i],&x[i]);
v[i + ] = u1[i];
u1[i + ] = v[i];
x[i + ] = x[i];
addedge(u1[i],v[i],i);
addedge(v[i],u1[i],i + );
} solve(); output(); return ; }
cf div2 234 D的更多相关文章
- cf div2 234 E
E. Inna and Binary Logic time limit per test 3 seconds memory limit per test 256 megabytes input sta ...
- 离线dfs CF div2 707 D
http://codeforces.com/contest/707/problem/D 先说一下离线和在线:在线的意思就是每一个询问单独处理复杂度O(多少多少),离线是指将所有的可能的询问先一次都处理 ...
- cf div2 239 D
D. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- cf div2 236 D
D. Upgrading Array time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- cf div2 237 D
D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...
- cf div2 238 D
D. Toy Sum time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- cf div2 238 c
C. Unusual Product time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- cf div2 235 D
D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...
- CF div2 D BFS
http://codeforces.com/contest/676/problem/D 题目大意: 勇者去迷宫杀恶龙.迷宫是有n*m的方格子组成的.迷宫上有各种记号,这些记号表达着能走的方向.当且仅当 ...
随机推荐
- eclipse集成maven
1.工具下载: Eclipse4.2 jee版本(这里使用最新的Eclipse版本,3.7以上版本按照以下步骤都可以) 下载地址:http://www.eclipse.org/downloads/do ...
- 窗体皮肤实现 - 在VC中简单实现绘制(五)
到第四部分Delphi XE3的代码能基本完成窗体界面的绘制.窗口中的其他控件的处理方法也是相同的,截获消息处理消息. 问题这个编译出来的个头可不小.Release版本竟然2.43M,完全是个胖子.系 ...
- hdu 1008
题目意思是:给你N个数字 每个数字表示多少层楼 现在要你从0层楼开始坐电梯 一次按顺序走过这些楼层 规则是 上楼6秒 ,下楼4秒,每次到达一个楼层停5秒..... 思路:模拟 代码如下:(要注意 ...
- com.Goods.ForEach
com.Goods.ForEach(g => { g.TransactionPrice = getUnitPriceByProductId(g.ProductID); g.ExpressMone ...
- IT安全的本质
(1)信任:服务端信任客户端的请求参数. (2)可控:客户端的请求参数可以被控制,任意修改. 服务端信任+客户端可控 =不安全. 服务端信任+客户端不可控=安全. 服务端不信任+客户端可控=安全. 服 ...
- mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
安装Mysql后利用SQLyogEnt启动是提示“access denied for user 'root'@'localhost'(using password:YES)”,开始我还为是因为是密码问 ...
- windows和linux环境下制作U盘启动盘
新笔记本上,要装xp的系统,100%会破坏原有的Linux系统,因为安装xp的时候会自动覆盖硬盘的主引导扇区,这个扇区一旦被重写,那么原有的linux根本就启动不了. 要想玩linux和xp双系统,一 ...
- hadoop学习日志
Hadoop思想之源:Google 面对的数据和计算难题 ——大量的网页怎么存储 ——搜索算法 带给我们的关键技术和思想 ——GFS ——Map-Reduce ——Bigtable Hadoop创始人 ...
- Hibernate内存溢出分析一例
公司业务系统在进行压力测试时,压测24小时后系统发生内存溢出.经过分析读dump文件,发现org.hibernate.stat.StatisticsImpl类的hashmap类型的变量存储了大量数据( ...
- 不同系统平台下Java默认的安装路径
下面以Oracle的JDK7update 51为例: • 32-bit JDK on Windows: C:\Program Files (x86)\Java\jdk1.7.0_51 • 64-bit ...