Multi-Task Learning as Multi-Objective Optimization
阿新 • • 發佈:2022-05-08
題目連結 https://www.luogu.com.cn/problem/P1807
拓撲排序求DAG(有向無環圖)的最長路。
放AC程式碼
1 #include<bits/stdc++.h> 2 #define MAX 50010 3 using namespace std; 4 int n,m,cnt,x; 5 int head[MAX]; 6 int in[MAX]; 7 int dis[MAX]; 8 queue<int>q; 9 10 struct node 11 { 12 int v,w,next; 13 }edge[MAX]; 14 15 voidadd(int u,int v,int w) 16 { 17 edge[++cnt].v=v; 18 edge[cnt].w=w; 19 edge[cnt].next=head[u]; 20 head[u]=cnt; 21 } 22 23 int main() 24 { 25 int n,m; 26 cin>>n>>m; 27 while(m--) 28 { 29 int u,v,w; 30 cin>>u>>v>>w; 31 add(u,v,w);32 in[v]++; 33 } 34 memset(dis,-0x7f,sizeof(dis)); 35 //初始化,將除1的點全部賦為負無窮,保證從1開始 36 for(int i=1; i<=n; i++) 37 { 38 if(!in[i]) q.push(i); 39 if(i==1) dis[i]=0; 40 else dis[i]=-MAX; 41 } 42 while(!q.empty()) 43 { 44 x=q.front(); 45 q.pop();46 for(int i=head[x]; i; i=edge[i].next) 47 {//像是最短路徑,只是把min換成max 48 in[edge[i].v]--;//入度-1 49 dis[edge[i].v]=max(dis[edge[i].v],dis[x]+edge[i].w);//更新,即: 50 //這個點的值最大=max(這個點原來的值,他的前驅節點+連線前驅和他自己的邊的值) 51 if(in[edge[i].v]==0) q.push(edge[i].v);//如果入度為0則入隊 52 } 53 } 54 if(dis[n]<0) cout<<-1<<endl;//不取0,因為可能所有的邊的權值都為0 55 else cout<<dis[n]<<endl; 56 return 0; 57 }