1219: 爱抱怨的一对儿
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 13 Solved: 4
[ Submit][ Status][ Web Board]
Description
唐学长和他的女朋友又要出去旅游了,这次他们要想去好多个城市!
已知有n个城市,为了方便城市之间联络,城市之间建立了m条路,每条路连接两座城市。两个城市间可能存在多条路连接。
然而,由于雨水的冲刷,有一些路面临着不能使用的危险,这样就不能通过了。如果两个城市间的所有路都不能使用,则这两个城市就不能直接到达了。
然而,只要这两个城市能通过其他的路或者其他的城市互相到达,就认为是连接的。但是,如果前一天两个小岛之间还有方法可以到达,
后一天却不能到达了,唐学长和他的女朋友就会抱怨一次(注意:如果多条路同时在同一天中都不能使用了,那么只抱怨一次)。
现在已经知道了每条路能使用的天数,超过这个天数就不能使用了。现在请你计算一下,唐学长和他的女朋友一共要抱怨多少次!
已知有n个城市,为了方便城市之间联络,城市之间建立了m条路,每条路连接两座城市。两个城市间可能存在多条路连接。
然而,由于雨水的冲刷,有一些路面临着不能使用的危险,这样就不能通过了。如果两个城市间的所有路都不能使用,则这两个城市就不能直接到达了。
然而,只要这两个城市能通过其他的路或者其他的城市互相到达,就认为是连接的。但是,如果前一天两个小岛之间还有方法可以到达,
后一天却不能到达了,唐学长和他的女朋友就会抱怨一次(注意:如果多条路同时在同一天中都不能使用了,那么只抱怨一次)。
现在已经知道了每条路能使用的天数,超过这个天数就不能使用了。现在请你计算一下,唐学长和他的女朋友一共要抱怨多少次!
Input
多组测试数据。
每组数据先输入两个正整数n和m。
接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个城市,能使用t天。城市的编号从1开始递增。(1≤n≤10000,1≤m≤100000,1<=a,b<=n,1≤t≤200000)
Output
输出一个整数,表示唐学长和他的女朋友总共抱怨的次数。
Sample Input
4 41 2 21 3 22 3 13 4 3
Sample Output
2
HINT
对于样例:
第一天后2和3之间的路不能使用,不影响。
第二天后1和2之间,以及1和3之间的路不能使用,唐学长和他的女朋友会抱怨一次。
第三天后3和4之间的路不能使用,唐学长和他的女朋友会抱怨一次。
Source
最小生成树
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
#define MAX_N 10000
#define MAX_M 100000
int uset[MAX_N];
int trank[MAX_N];
struct Edge
{
int a,b;
int cost;
};
vector<Edge> es;
vector<int> G[MAX_N];
void InitUnion(int n)
{
for(int i=0;i<n;i++)
{
uset[i]=i;
trank[i]=0;
}
}
int Find(int x)
{
return uset[x]==x?x:uset[x]=Find(uset[x]);
}
void Union(int a,int b)
{
a=Find(a);
b=Find(b);
if(a==b) return;
if(trank[a]<trank[b])
uset[a]=b;
else
{
uset[b]=a;
if(trank[a]==trank[b])
trank[a]++;
}
}
bool Same(int a,int b)
{
return Find(a)==Find(b);
}
int n,m;
int c[MAX_M];
bool cmp(const Edge &a,const Edge &b)
{
return a.cost>b.cost;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
es.clear();
for(int i=0; i<m; i++)
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
es.push_back(Edge {a,b,t});
}
sort(es.begin(),es.end(),cmp);
InitUnion(n+1);
int cnt=0;
for(int i=0; i<m; i++)
{
if(!Same(es[i].a,es[i].b))
{
Union(es[i].a,es[i].b);
c[cnt++]=es[i].cost;
}
}
printf("%d\n",unique(c,c+cnt)-c);
}
return 0;
}