cf400D
2015-11-04 22:02
232 查看
// #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> #define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__ ) #else #define debug(...) #endif #define MEM(x,y) memset(x, y,sizeof x) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const int maxn = 1e5 + 10; int f[maxn], a[maxn]; int g[505][505], cnt[505]; int n,k,m; int find(int x){ if (f[x] == x) return x; else return f[x] = find(f[x]); } void uion(int x,int y){ int t1 = find(x); int t2 = find(y); if (t1 == t2) return; else f[t1] = t2; return; } bool Judge(){ for (int i = 1;i <= k;i++){ int tmp = -1; for (int j = cnt[i-1] + 1;j <= cnt[i];j++){ if (tmp == -1) tmp = find(j); else if (find(j) != tmp) return false; } } return true; } void floyd(){ for (int l = 1;l <= k;l++){ for (int i = 1;i <= k;i++){ if (i != l){ for (int j = 1;j <= k;j++){ if (j != i && j != l){ if ((g[i][l] + g[l][j] < g[i][j] || g[i][j] < 0) && g[i][l] >= 0 && g[l][j] >= 0){ g[i][j] = g[i][l] + g[l][j]; } } } } } } } void print(){ for (int i = 1;i <= k;i++){ g[i][i] = 0; for (int j = 1;j <= k;j++){ if (j == 1) printf("%d",g[i][j]); else printf(" %d",g[i][j]); } // debug("here\n"); printf("\n"); } return ; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); scanf("%d%d%d",&n,&m,&k); for (int i = 1, now = 1;i <= k;i++){ int x; scanf("%d",&x); for (int j = 0;j < x;j++){ a[j+now] = i; f[j+now] = j+now; } now+=x; cnt[i] = now - 1; } MEM(g, -1); while(m--){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if (a[x] == a[y]){ if (z==0) uion(x,y); } else { if (z == 0) uion(x,y); if (g[a[x]][a[y]] == -1) g[a[x]][a[y]] = g[a[y]][a[x]] = z; else if (z < g[a[x]][a[y]]) g[a[x]][a[y]] = g[a[y]][a[x]] = z; } } if (!Judge()) puts("No"); else{ puts("Yes"); floyd(); print(); } return 0; }
相关文章推荐
- 反射,System.Type类
- Excel sheet Column Title
- java基础之分解质因数练习
- 视频会议及流媒体十大开源项目
- iOS关于CGContextSetBlendMode: invalid context 0x0的错误
- Java8 Lambda表达式教程
- virtual关键字
- FOJ 1608 Huge Mission 线段树
- 基带信号、载波信号和宽带信号
- 五猴分桃问题详解
- OC基础知识 -- 类和对象
- 将jeecms中微信后台功能和前台认证以及接收消息的功能,修改为插件形式
- 动态规划求最长递增子序列(longest increasing subsequence)
- hdu2547 无剑无我
- hdoj3975Easy Fruit Ninja
- Tiny6410+K9GAG08U0E
- 修改MySQL默认数据库存放路径
- leetcode-Valid Anagram
- AngularJS API之equal比较对象
- Ubuntu 14.04数据库服务器--mysql的安装和配置