第一题:最小生成树
小于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) 回帖