标签:amp and desc represent single nes int 最小生成树算法 注意
Description
Input
Output
Sample Input
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
Sample Output
3
Not Unique!
次小生成树与最小生成树一样即不唯一,注意判断原图为一棵树的情况。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> #define nn 110 #define mm 20010 using namespace std; int mst=0,e=0,n,m,fa[nn],fir[nn],nxt[mm],to[mm],w[mm],f[nn][nn]; bool vis[nn]; int read() { int ans=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} while(isdigit(ch)) {ans=ans*10+ch-‘0‘;ch=getchar();} return ans*f; } struct bb{ int fro,to,w; bool use; }g[mm]; int find(int x) { return fa[x]==x? x:fa[x]=fa[fa[x]]; } void add(int a,int b,int ww) { nxt[++e]=fir[a];fir[a]=e;to[e]=b;w[e]=ww; nxt[++e]=fir[b];fir[b]=e;to[e]=a;w[e]=ww; } void kruskal() { int sum=0;e=0;mst=0; for(int i=1;i<=n;i++) fa[i]=i; memset(fir,0,sizeof(fir)); memset(nxt,0,sizeof(nxt)); for(int i=1;i<=m;i++) if(find(g[i].fro)!=find(g[i].to)) { fa[fa[g[i].fro]]=fa[g[i].to]; add(g[i].fro,g[i].to,g[i].w); mst+=g[i].w; g[i].use=1; /////// if(++sum==n-1) break; } } void dfs(int o,int s) { vis[o]=1; for(int i=fir[o];i;i=nxt[i]) if(!vis[to[i]]) { f[s][to[i]]=max(f[s][o],w[i]); dfs(to[i],s); } } void les() { int more=0,cha=100000000; for(int i=1;i<=m;i++) if(!g[i].use) { more++; cha=min(cha,g[i].w-f[g[i].fro][g[i].to]); } if(!more) printf("%d\n",mst); else if(!cha) printf("Not Unique!\n"); else printf("%d\n",mst); } int main() { int t; t=read(); while(t--) { n=read();m=read(); for(int i=1;i<=m;i++) { g[i].fro=read();g[i].to=read();g[i].w=read();g[i].use=0; } kruskal(); for(int i=2;i<=n;i++) vis[i]=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) vis[j]=0; dfs(i,i); } les(); } return 0; }
标签:amp and desc represent single nes int 最小生成树算法 注意
原文地址:http://www.cnblogs.com/charlotte-o/p/7577322.html