| 记录编号 |
121612 |
评测结果 |
AAAAAAAAA |
| 题目名称 |
535.工程规划 |
最终得分 |
100 |
| 用户昵称 |
ztx |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.000 s |
| 提交时间 |
2014-09-20 17:51:18 |
内存使用 |
0.00 MiB |
显示代码纯文本
/*
author :hzoi_天翔
title :工程规划
ALG :差分约束 Bellman-Ford
comment :
*/
#include <cstdio>
#define maxn 1002
#define maxm 5002
#define info 1000000
/*struct Star{
int to , len , next ;
} map[maxm] ; int head[maxn] = {0} , tot = 0 ;
void addEdge(int to , int from , int len) {
tot ++ ; map[tot].to = to ; map[tot].len = len ;
map[tot].next = head[from] ; head[from] = tot ;
}*/
struct Edge{
int from , to , len ;
bool operator () (int TO,int FROM,int LEN){
this->from=FROM;this->to=TO;this->len=LEN;
}
} edges[maxm] ; int tot = 0 ;
int n , m ;
int a , b , c , flag ;
int dis[maxn] = {0} ;
int cnt[maxn] = {0} ;//统计入队次数
bool inq[maxn] = {false} ;
bool Relax(int f, int t, int w) {
if (dis[t] > dis[f]+w) dis[t] = dis[f]+w ;
else return false ;
return flag = true ;
}
bool Bellman_Ford() {
for (int i = 1 ; i <= n ; i ++ ) dis[i] = info ; dis[1] = 0 ;
for (int i = 1 ; i < n ; i ++ ) {
flag = 0 ;
for (int j = 1 ; j <= tot ; j ++ )
Relax(edges[j].from , edges[j].to , edges[j].len) ;
if (!flag) return false ;
}
if (flag) for (int i = 1 ; i <= tot ; i ++ )
if (Relax(edges[i].from , edges[i].to , edges[i].len))
return true ;
return false ;
}
void PrintfAns(){
int tmp = info ;
for (int i = 1 ; i <= n ; i ++ ) if (dis[i] < tmp) tmp = dis[i] ;
for (int i = 1 ; i <= n ; i ++ ) printf("%d\n", dis[i]-tmp ) ;
}
int main() {
#define READ
#ifdef READ
freopen("work.in" ,"r",stdin ) ;
freopen("work.out","w",stdout) ;
#endif
scanf ("%d%d", &n , &m ) ;
for (int i = 1 ; i <= m ; i ++ ) {
scanf("%d%d%d", &a , &b , &c ) ;
//addEdge(a , b , c) ;
edges[++tot](a,b,c) ;
}
if (Bellman_Ford()) printf("NO SOLUTION\n") ;
else PrintfAns() ;
return 0 ;
}