有一棵由n個結點構成的樹,每一條邊上都有其對應的權值。現在給定起點,求從該點出發的一條路徑(至少有一條邊)使得這條路徑上的權值之和最大,並輸出這個最大值。
input
第一行乙個正整數t,代表資料組數。每組資料第一行兩個正整數n(2<=n<=10^5),s(1<=s<=n),分別表示樹結點數目以及給定的起點,點的編號從1至n。接下來m行,每行三個整數x,y,z,(1<=x,y<=n,|z|<=1000),代表編號為x和y的點之間有一條權值為z的雙向邊。
output
每組資料輸出一行,即所找到路徑的最大權值(格式參見樣例)。
sample input
2
3 11 2 10
1 3 5
5 51 5 70
4 3 100
5 3 -10
2 5 60
sample output
case #1: 10
case #2: 90
思路:這題有點坑就是我開始把題意理解有點偏差,我以為只有dfs跑的節點之後還有節點可以跑那麼就必須跑,形成乙個整條的路徑然後求得最大值,但是其實是只要能到某一節點,比方我到a點的距離是100,a還能到b距離為-10,那麼最後的最大值為100,而不是90.
知道這樣這題就很明顯了,利用鄰接表儲存邊和權重,利用dist陣列,儲存對應起點到每乙個點的距離大小,vis陣列則判斷這個點是否走過了(因為是無向圖,存邊的時候edge now; now.to=y;now.value=z; g[x].push_back(now); now.to=x;now.value=z; g[y].push_back(now);兩個方向都要存,判斷是否走過就是這裡是否會進入死迴圈),最後在dist陣列跑一遍找出那個最大值就ok,然後就是dfs深搜沒什麼太多難點了。
#include #include #include #include #include #define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5;
int t;
int n,s;
int dist[maxn];
int vis[maxn];
struct edge
;vectorg[maxn];
void init()
void dfs(int s)
dist[s]=0;
dfs(s);
int ans=-inf;
for(int i=1;i<=n;i++)
ans=max(ans,dist[i]);
cout<<"case #"<}
return 0;
}
196 質數距離
196.質數距離 題目描述 給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第...
ACWING196 質數距離
給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...
Acwing196 質數距離
給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...