描述格式
輸入格式
第一行兩個數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一百塊錢。一天,三個人遇到了一起。由於他們都不夠理智,...