本周去医院复查了,没在学校,最近几天在家休养,因为只能吃流食,同时,这不妨碍学习。本周主要还是看博客为主,一个是Dijkstra算法,还有bellman算法,bellman算法是我在P1339 [USACO09OCT]Heat Wave G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)的题解中遇到的,就是无向图求最短路的好方法,主要思想是:首先用结构体存储起点终点和路程(此时要存储两个的,也就是去程和返程,将起点终点调换),之后开始遍历,如果顶点数为n,那么执行n-1次循环,每次遍历所有边,做松弛操作,多亏这个题给的数不多,不会超时。
void bellman(){
int flag=1,i,j;
for(j=0;j<n-1&&flag;j++){
flag=0;
for(i=0;i<cnt;i++) {
int u=Edge[i].x,v=Edge[i].y,w=Edge[i].w;
if(dis[u]+w<dis[v]) {
flag=1;
dis[v]=dis[u]+w;
}
}
}
}
主要还是精力不足,回家看病耽误了好多学习时间,落下的课还要补,日语、足球、创新创业、跆拳道等四门课要期末,压力挺大的。
P7228 [COCI2015-2016#3] MOLEKULE - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)这个创建代价最小的有向图,题意是给出了无向边,然后指定方向使得代价最小,题解绝大多数都用的深搜,我用“暴力枚举”,应该是这样吧,我的思路是把每种情况都列举一遍,用二维数组存储指定方向的方案和该方案的编号,并且存储每个方案的代价,所有情况列举一遍之后找出其中代价最小的方案的编号,输出方案,思路是没错,就是超时,我也想过用深搜,不知道该咋实现,题解中有一篇让我豁然开朗
int n,U[N],V[N],dep[N],ans[N];
vector<pair<int,int> > e[N];
inline void dfs(int u,int fa){
dep[u] = dep[fa]+1;
for(int i = 0;i<e[u].size();++i){
int v = e[u][i].first,id = e[u][i].second;
if(v == fa) continue;
if(dep[u]%2 == 1) ans[id] = U[id]==u?1:0;
else ans[id] = U[id]==v?1:0;
dfs(v,u);
}
}
int main(){
n = read();
FOR(i,1,n-1) U[i] = read(),V[i] = read(),add(U[i],V[i],i);
dfs(1,0);
FOR(i,1,n-1) printf("%d\n",(ans[i]+1)&1);
return 0;
}
P4673 [BalticOI 2005]Bus Trip - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)这个类似最小生成树的题,遇到好多差不多的这种类型的题,就是从一个地方到另外一个地方求最短距离、时间之类的,不过这个题多了等待的时间,这是坐公交类型的题,从一个地点到另外一个地点的途中,会有等车的时间要算上,难就难在了这个加等车的时间的算法上了,就在这里卡住了。