vijos1070 新年趣事

2021-08-19 14:13:43 字數 1709 閱讀 9404

描述格式

輸入格式

第一行兩個數n(2<=n<=500),m,分別表示國家的城市數和可以修建鐵路的城市有多少對。

接下來m行,每行三個正整數ai,bi,ci,表示城市ai和bi之間可以修建鐵路,費用為ci。

輸出格式

第一行:」cost: 「+乙個整數,表示最小費用。(若不存在,輸出-1)

第二行:」cost: 「+乙個整數,表示第二小費用。(若不存在,輸出-1)

樣例1樣例輸入1

4 6

1 2 2

2 3 2

3 4 2

4 1 2

1 3 1

2 4 1

copy

樣例輸出1

cost: 4

cost: 4

copy

限制各個測試點1s

提示sample input #2

3 2

1 2 2

2 3 2

sample output #2

cost: 4

cost: -1

次小生成樹 :思路就是我們先建立一棵最小生成樹

然後列舉非樹邊 然後把兩個端點樹上路徑的最大值找出來,求出最大值和非樹邊權值差 找到權值差最小即可

#include

#include

#include

#define n 550

using namespace std;

inline int

read()

while (ch<='9'&&ch>='0')

return

x*f;

}struct nodedata[n*n],data1[n<<1];

int fa1[n],m,n,h[n],fa[n][20],st[n][20],dep[n],qq,log[n];bool visit[n*n];

inline bool cmp(node a,node b)

void dfs1(int

x) dfs1(y);

}}inline int lca(int

x,int

y) }

}if (x==y) return min1;

for (int j=19;j>=0;--j)

}return max(min1,max(st[x][0],st[y][0]));

}int main()

sort(data+1,data+m+1,cmp);

for (int i=1;i<=n;++i) fa1[i]=i;int cnt=0,num=0,ans=0;

for (int i=1;i<=m;++i)

} //for (int i=1;i<=num;++i) printf("%d

%d%d\n",data1[i].x,data1[i].y,data1[i].z);printf("asdfasd\n");

//if (cnt1)

printf("cost: %d\n",ans);

log[0]=-1;

for (int i=1;i<=n;++i) log[i]=log[i>>1]+1;

dep[1]=1;dfs1(1);bool flag=false;int ans1=0x7f7f7f7f;

for (int i=1;i<=m;++i)

P1070 新年趣事之遊戲

次小生成樹板題。先求出最小生成樹。因為題目沒有說清楚邊的條數,所以我使用了prim 然後在最小生成樹上預處理出每兩點間的樹邊的最大值。每個點bfs一邊就好了。然後列舉沒加進去的邊,每次替掉所在環上除自己外的最大值,取min就是答案了。複雜度o n 2 include include include ...

vijos1072 新年趣事之債務

題目背景 在hnsdfz的資訊組裡,vivian snow charles和sunnypig之間有著一種奇怪的債務關係 vivian snow欠了charles一百塊錢,charles欠了sunnypig一百塊錢,sunnypig欠了vivian snow一百塊錢。問題描述 一天,三個人遇到了一起。...

Vijos 1072題 新年趣事之債務

在hnsdfz的資訊組裡,vivian snow charles和sunnypig之間有著一種奇怪的債務關係 vivian snow欠了charles一百塊錢,charles欠了sunnypig一百塊錢,sunnypig欠了vivian snow一百塊錢。一天,三個人遇到了一起。由於他們都不夠理智,...