这几天一直在写android,没有技术含量,而且超级麻烦,真烦。下周二要给老板交差,不开心。明天得抓紧,要不然弄不完了。
这道题题干不怎么好理解啊,我还以为珠子不能同一水平线呢。递推法思路不好找,找到了写程序比较简单。每次在找可以计算的方程时,不用从头开始的,书上说可以拓扑排序,每个线头的两端可以看做是有向图的一条边,是一定没有回路的。依稀记得有看到过有向无环图先拓扑排序总会简单。不高兴写复杂的了,直接暴力。
#include <cstdio>
#include <string.h>
using namespace std;
int u[300], d[300], l[300], n, p, h[300];
bool vis[300];
int main(){
while(~scanf("%d%d", &n, &p)){
for(int i=0;i<p;i++)
scanf("%d%d%d", &u[i], &d[i], &l[i]);
memset(vis, 0, sizeof(vis));
int stack[300];
int cu = 1;
stack[cu] = 1;
h[1] = 0;vis[1] = 1;
while(cu){
int cc = stack[cu--];
for(int j=0;j<p;j++){
if(u[j] == cc&& !vis[d[j]]){
vis[d[j]] = 1;
h[d[j]] = h[cc] - l[j];
stack[++cu] = d[j];
}else if(d[j] == cc&& !vis[u[j]]){
vis[u[j]] = 1;
h[u[j]] = h[cc] + l[j];
stack[++cu] = u[j];
}
}
}
int min = h[1];
for(int i=2;i<=n;i++){
if(h[i]<min)
min = h[i];
}
for(int i=1;i<=n;i++){
h[i] -= min;
printf("%d %d\n", i, h[i]);
}
}
return 0;
}