您的位置:首页 > 其它

codeforces 170 div2 C

2013-03-02 18:30 337 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn=100005;
const int oo=0x3fffffff;
int f[maxn];
int color[maxn];

int find(int x)
{
if(x==f[x]) return x;
return f[x]=find(f[x]);
}

int main()
{
int n, m;
while(cin >> n >> m)
{
for(int i=0; i<maxn; i++)
f[i]=i, color[i]=0;
int cnt=0;
for(int i=1; i<=n; i++)
{
int k, a;
cin >> k;
if(k==0) {color[i]=1;cnt++;continue;}
while(k--)
{
scanf("%d",&a);
int fa=find(i);
int fb=find(a+n);//间接将两个n以内的union一起
if(fa!=fb)
f[fb]=fa;
}
}
int ans=0;
for(int i=1; i<=n; i++)
{
if(color[i]) continue;
if(i==find(i)) ans++;
}
if(ans==0) ans=1;
cout << cnt+ans-1 <<endl;
}
return 0;

题目也可以用prim() 通过任意点来求最短路

用dijkstra 效率太低 要指定点 还要循环n次
http://codeforces.com/contest/278/problem/C
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: