2019.9.11 星期四
今天去招聘会,和上次工院的一样,发现并没有什么我可以做的工作。遇见了的朋友谈起这些也是摆摆手,看来可能中国大二的学生真的不属于这里吧。不过后来听说有微软?我赶紧跑过去看了看,老天,人排成了一大队。老老实实排吧,快要排到的时候,我突然想起来今天仓促之下未能来得及换衣服,一身运动装,uhhhh, 真是灾难现场了。厚着脸皮去问了下,他们说他们主要要招大三快要毕业的,大二可以网申。好吧这不就是摆明了不要我嘛hhh。
可能是太饿了还是太困了,从刚才写完那道题开始效率就每况愈下,直到现在了脑子里一点想学习的想法都没有。那咱就不学了!(暴言然后向生活低头认错)根据以往的经验,我写五三的时候高效两周总会有半周的低效率,强行学习只会让自己的效率更低,不如先休息休息。明天再战,今天不工作了。
那今天就允许自己没有新进展,不过事实上还是有一点的,作业都写完了,上课也都的确在好好听来着,写代码也写了4个小时了只写出来一题,现在什么也不想干,只想回家好好吃一顿饭,然而我还在控制体重,生无可恋(-。-; )。 上周连续三天吃多,直接导致这周感觉整个人都不好了。有趣的是自己胖还就是胖脸,肚子和腰上是一点赘肉都没有,脸是要给别人看的,所以,不能胖!减肥嘛,这个事情对于我这个从200斤瘦下来的人不是难事,每天都不吃东西就好了。不过我发现来这里之后挺难做到的,学习的时候没有别的事情就想吃东西,这也难怪去北京学习半个月花了1000块钱整在吃上,估计要搁到前几年我真的是挺难养活的hhh。学着学着就打开食物页面了,看到椰蓉月饼,看到郑州的上井自助和猪肚鸡,omg,饿死了饿死了,我现在真的想冲到宿舍吃东西,然而想想自己看着好吃的冲回去吃了一堆垃圾食品也是够搞笑的,还是算了,减肥!这周末中秋节了,自己屯着的月饼可以拿出来了,到周末放松下。跟朋友分享下月饼。
来写下今天的进展吧,写完我就撤了,今天总的来说是一个非常良好的开端,我学会如何删边了,遇到没有重边的图,直接在SPFA上设置限制条件遇到要删掉的那条边直接跳过去就行了,果断AC了HDU1595,不过有点头疼的就是没有找到怎么判重,尤其是双向边,两遍插入之后的对应顺序搞不清很容易就误删或者是误判了,哪一个出现了问题代码都过不去。明天再学。我发现新的练习题集好像很多内容都是图论题了,昨天做了道杭电的问题,求两个城市之间途径两个城市的次小最短路,我做着做着就感觉不对劲了,我感觉马上要打表然后递推求解了,这题我好像在哪见过,而且不是最短路的题目。一回去翻郭神的讲义,md,果然这不是最短路而是典型tsp问题的,出题人怎么搞的。不过这种题确实和以前遇到的单纯最短路问题相比有趣多了,也更贴近实战,不妨一试。今天就到这里了,先把AC代码发上,其他?那是明天的事情了,拜拜了各位。
#include <bits/stdc++.h>
using namespace std;
#define limit 20000 + 5
#define INF 0x3f3f3f3f
#define lowbit(i) i&(-i)//定义lowbit函数
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
struct edge{
int to ;
int weight;
edge() = default;
edge(int tt, int ww) : to(tt), weight(ww){}
bool operator<(const edge & rhs)const{
return weight > rhs.weight;
}
};
vector<vector<edge> >v,rev;
int x,y;
double getDist(int x1, int y1 , int x2 ,int y2){
return sqrt(pow(x1 - x2,2) + pow(y1 - y2,2));
}
int n,m;
int vis[limit],Prev[limit],dist[limit];
int start, en;
void spfa(int s){
for(int i = 0 ; i <= n ; ++i){
vis[i] = 0;
dist[i] = INF;
Prev[i] = 0;
}//初始化
queue<int>q;
dist[s] = 0;
vis[s] = 1;
q.push(s);
while(!q.empty()){
int vs = q.front();
q.pop();
vis[vs] = 0;
for(int i = 0 ; i < v[vs].size() ; ++i){
int ve = v[vs][i].to, weight = v[vs][i].weight;
if(vs == start && ve == en){
continue;//别走这条边,已经被选定了
}
if(dist[vs] != INF && dist[vs] + weight < dist[ve]){
dist[ve] = dist[vs] + weight;
Prev[ve] = vs;
//printf("The edge being updated is %d to %d\n", Prev[ve], ve);
if(!vis[ve]){
vis[ve] = 1;
q.push(ve);//继续查找
}
}
}
}
}
void spfa2(int s){
for(int i = 0 ; i <= n ; ++i){
vis[i] = 0;
dist[i] = INF;
}//初始化
queue<int>q;
dist[s] = 0;
vis[s] = 1;
q.push(s);
while(!q.empty()){
int vs = q.front();
q.pop();
vis[vs] = 0;
for(int i = 0 ; i < v[vs].size() ; ++i){
int ve = v[vs][i].to, weight = v[vs][i].weight;
if(vs == start && ve == en){
continue;//别走这条边,已经被选定了
}
if(dist[vs] != INF && dist[vs] + weight < dist[ve]){
dist[ve] = dist[vs] + weight;
if(!vis[ve]){
vis[ve] = 1;
q.push(ve);//继续查找
}
}
}
}
}
int main(){
while(~scanf("%d%d" , &n,&m)) {
v.resize(n + 1);
start = -1, en = -1;
for(int i = 0 ; i < m ; ++i){
int a,b,w;
scanf("%d%d%d" , &a, &b , &w);
//v[a].push_back(edge(b,w));
v[b].push_back(edge(a,w));
}
spfa(n);
int maxLen = -INF;
int iter = 1;//迭代器
int route = dist[1];
do{
start = Prev[iter] ,en = iter;
spfa2(n);//从n出发走到1
if(dist[1] != INF){
maxLen = max(maxLen, dist[1]);
}
iter = Prev[iter];//找到前面这一点
//printf("->%d",iter);
}while(iter);
printf("\n");
ff(maxLen != -INF ? maxLen: route);
v.clear();
}
return 0;
}