首页 > 代码库 > [SCOI2005]繁忙的都市

[SCOI2005]繁忙的都市

OJ题号:BZOJ1083、洛谷2330

思路:Kruskal。

 1 #include<cstdio> 2 #include<utility> 3 #include<algorithm> 4 #define w first 5 #define u second.first 6 #define v second.second 7 typedef std::pair<int,std::pair<int,int> > Edge; 8 const int N=301; 9 class UnionFindSet {10     private:11         int anc[N];12         int Find(int x) {13             return (x==anc[x])?x:(anc[x]=Find(anc[x]));14         }15     public:16         UnionFindSet(int n) {17             for(int i=1;i<=n;i++) anc[i]=i;18         }19         void Union(int x,int y) {20             anc[Find(y)]=Find(x);21         }22         bool isConnected(int x,int y) {23             return Find(x)==Find(y);24         }25 };26 int main() {27     int n,m;28     scanf("%d%d",&n,&m);29     Edge e[m];30     for(int i=0;i<m;i++) {31         int a,b,c;32         scanf("%d%d%d",&a,&b,&c);33         e[i]=std::make_pair(c,std::make_pair(a,b));34     }35     std::sort(&e[0],&e[m]);36     UnionFindSet s(n);37     int ans=0,max=0;38     for(int i=0;i<m;i++) {39         if(s.isConnected(e[i].u,e[i].v)) continue;40         s.Union(e[i].u,e[i].v);41         max=std::max(max,e[i].w);42         ans++;43     }44     printf("%d %d\n",ans,max);45     return 0;46 }

 

[SCOI2005]繁忙的都市