PAT T1016 Uniqueness of MST
2024-09-14 03:59:30
dfs判断连通块的数量,prim算法建立最小生成树并判断是否唯一~
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int inf=1e9;
int g[maxn][maxn];
int d[maxn];
int visit[maxn];
int N,M;
struct edge {
int v1,v2;
};
vector<edge> vi;
void dfs (int s) {
visit[s]=true;
for (int i=;i<=N;i++)
if (g[s][i]!=inf&&visit[i]==false) dfs(i);
}
int dfsTrave () {
int block=;
for (int i=;i<=N;i++) {
if (visit[i]==false) {
dfs(i);
block++;
}
}
return block;
}
int flag=;
int prim (int s) {
fill (d,d+maxn,inf);
fill (visit,visit+maxn,);
d[s]=;
int ans=;
for (int i=;i<=N;i++) {
int u=-,min=inf;
for (int j=;j<=N;j++)
if (visit[j]==false&&d[j]<min) {
u=j;
min=d[j];
}
if (u==-) return -;
visit[u]=;
ans+=d[u];
int num=;
for (int v=;v<=N;v++)
if (visit[v]&&g[u][v]==min) num++;
if (num>) flag++;
for (int v=;v<=N;v++) {
if (visit[v]==false&&g[u][v]!=inf&&g[u][v]<d[v])
d[v]=g[u][v];
}
}
return ans;
}
int main () {
scanf ("%d %d",&N,&M);
int u,v;
for (int i=;i<=N;i++)
for (int j=;j<=N;j++)
g[i][j]=inf;
for (int i=;i<M;i++) {
scanf ("%d %d",&u,&v);
scanf ("%d",&g[u][v]);
g[v][u]=g[u][v];
}
int block=dfsTrave ();
if (block>) {
printf ("No MST\n");
printf ("%d",block);
return ;
}
fill (visit,visit+maxn,false);
int mst=prim();
printf ("%d\n",mst);
if (flag==) printf ("Yes");
else printf ("No");
return ;
}
最新文章
- 深入Java虚拟机--判断对象存活状态
- HTML页面meta标签内容详解
- loadrunner 功能详解(一) - Run-time Settings
- hdu 1850 Being a Good Boy in Spring Festival 博弈论
- java 学习基础学习单词及java关键词
- python-增删改查
- [转] 详细整理:UITableView优化技巧
- 【PAT L2-001】最短路计数
- android 拍照 onCreate() 调用两次的问题
- 牛逼的验证码,printf返回值
- Project 3:N级魔方阵
- Combiners和Partitioner编程
- 长图的展开与收起(Android)
- 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
- 在树莓派3B、Ubuntu 18.04关闭板载Wifi、蓝牙
- ubuntu “无法获得锁 /var/lib/dpkg/lock -open”
- 第八周--Linux中进程调度与进程切换的过程
- URLConnection 和 HttpClients 发送请求范例【原】
- P4822 [BJWC2012]冻结
- 关于Java实现的进制转化(位运算)