第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後進入環,兩個指標必定相遇。當然,...