第一题:最小生成树
小于k的就建边,其他就是标准的最小生成树。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int M[210][210],n,m,k,T,book[210],dist[210];
const int Max= 233333333;
int Prime(int cur)
{
memset(book,0,sizeof(book));
book[cur]=1;
dist[1]=0;
int Min,sum=0;
for(int i=2;i<=n;i++)
{
dist[i]=M[cur][i];
}
for(int i=1;i<n;i++)
{
int index, Min=Max;
for(int j=1;j<=n;j++)
{
if(dist[j]<Min&&!book[j])
{
Min=dist[j];
index=j;
}
}
if(Min == Max) return -1;
book[index]=1;
sum += Min;
for(int j=1;j<=n;j++)
{
if(!book[j]&&dist[j]>M[index][j])
{
dist[j]=M[index][j];
}
}
}
return sum;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
M[i][j] = Max;
}
}
for(int i=0;i<m;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
if(c<=k){
M[a][b] = c;
M[b][a] = c;
}
}
int sum = Prime(1);
if(sum!=-1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
第二题:最短路径
注意一下有重复的边,取最小值,注意一下日期2020年2月29天。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=23333333333;
ll M[1010][1010],visit[1010],dist[1010];
int n,m;
void dijkstra(int s)
{
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
dist[i]=M[s][i];
visit[s]=1;
for(int i=1;i<=n-1;i++){
int index, minn=inf;
for(int j=1;j<=n;j++){
if(visit[j]!=1&&dist[j]<minn){
index=j;
minn=dist[j];
}
}
visit[index]=1;
for(int j=1;j<=n;j++){
if(visit[j]!=1&&dist[j]> dist[index] + M[index][j])
dist[j]= dist[index] + M[index][j];
}
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j) M[i][j] = inf;
else M[i][j] = 0;
}
}
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
M[a][b]=M[b][a]=c;
}
int s,e, mon,day,hour;
scanf("%d%d%d.%d/%d",&s,&e,&mon,&day,&hour);
dijkstra(s);
int new_hour = hour + dist[e];
int add_day = new_hour / 24;
new_hour = new_hour % 24;
int new_day = day + add_day;
int mon_day[] ={0,31,29,31,30,31,30,31,31,30,31,30,31,31,28,31,30};
int new_mon = mon;
while(new_day > mon_day[new_mon]){
new_day = new_day - mon_day[new_mon];
new_mon = new_mon + 1;
}
printf("%d.%d/%d\n", new_mon,new_day,new_hour);
}
}
全部评论
(0) 回帖