判斷是否存在負環

2021-08-19 16:06:50 字數 1493 閱讀 7615

第1行:乙個整數

f表示接下來會有

f個農場說明。

每個農場第一行:分別是三個空格隔開的整數:n,m和

w 第2行到

m+1行:三個空格分開的數字(s,

e,t)描述,分別為:需要

t秒走過s和

e之間的雙向路徑。兩個區域可能由乙個以上的路徑來連線。

第m +2到

m+ w+1

行:三個空格分開的數字(s,

e,t)描述蟲洞,描述單向路徑,s到

e且回溯t秒。

23 3 1

1 2 2

1 3 4

2 3 1

3 1 3

3 2 1

1 2 3

2 3 4

3 1 8

輸出f行,每行代表乙個農場

每個農場單獨的一行,」 yes」表示能滿足要求,

」no」

表示不能滿足要求。

noyes

思路很簡單,只要判斷是否存在負權環就行了,用floyd一次搞定!(小心

min函式,我因為加了

min函式而超時了),詳情見注釋

int map[505][505],n,m,k,num=0;  

int floyd()  

if(map[i][i]<0)return 1;  

}  return f;  

}  int main()  

for(i=1;i<=k;i++)  

num++;  

int f=floyd();  

if(!f)printf("no\n");  

else printf("yes\n");  

}  return 0;  

}bellman 演算法

思路:根據bellman-ford演算法,如果圖中不存在從

s可達的負圈,那麼最短路不過經過同乙個頂點兩次,也就是說最多經過

v-1條邊,

如果存在負圈,那麼這個迴圈更新次數會在第n次也會更新,實際上會無限更新,越來越小,所以一開始對所以點

i,都把

d[i]

初始化為

0,那麼可以檢查

出所有的負圈:

const int maxn=5500;  

struct edgeed[maxn];  

int n,m,w;  

bool solve(int e)  

}  }  return 0;  

}  int main()  

for(int i=0;i

int x,y,z;  

cin>>x>>y>>z;  

ed[cnt].from=x;  

ed[cnt].to=y;  

ed[cnt++].cost=-z;  

}  if(solve(cnt)) cout<<"yes"<

else cout<<"no"<

}  return 0;  

}  

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...

判斷單鏈表是否存在環

判斷單鏈表是否存在環,判斷兩個鍊錶是否相交問題詳解 有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如何找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 ...

判斷單鏈表是否存在環

問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,...