A - 还是畅通工程
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"----------------------"<<endl;
const int maxn = 1e6+10;
const int inf = 0x3f3f3f3f;
const int N = 1010;
int n,m;
ll ans ;
int pre[maxn];
struct node{
int u,v,cost;
}p[maxn];
void init(){
for(int i=0;i<=n;i++)
pre[i] = i;
}
bool cmp(node a,node b){
return a.cost < b.cost;
}
int find(int x){
if(x == pre[x]) return x;
else return pre[x] = find(pre[x]);
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
clr(p);
init();
ans = 0;
m = n * (n-1) / 2;
int u,v,cost;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&cost);
p[i].u = u;p[i].v = v;p[i].cost = cost;
}
sort(p,p+m,cmp);
for(int i=0;i<m;i++){
int dx = find(p[i].u);
int dy = find(p[i].v);
if(dx != dy){
pre[dy] = dx;
ans += p[i].cost;
}
}
cout<<ans<<endl;
}
return 0;
}
B - Highways
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node{
int u,v;
int value;
}p[300000];
void init(int n){
for(int i=1;i<=n;i++){
pre[i]=i;
}
}
int find(int x){
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y){
return x.value<y.value;
}
void mix(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
pre[fy]=fx;
}
}
int main(){
int t,s;
cin>>t;
while(t--){
scanf("%d",&n);
init(n);
int k=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&s);
p[k].u =i;
p[k].v =j;
p[k++].value =s;
}
}
sort(p,p+k,cmp);
int dis=0;
for(int i=0;i<k;i++){
if(find(p[i].u)!=find(p[i].v)){
if(p[i].value>dis)
dis=p[i].value ;
mix(p[i].u ,p[i].v );
}
}
printf("%d\n",dis);
}
return 0;
}
C - Networking
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
int u,v;
int value;
}p[300000];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y)
{
return x.value<y.value;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=0)
{
memset(pre,0,sizeof(pre));
scanf("%d",&m);
init(n);
if(m==0)
printf("0\n");
else
{
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
}
int ans=0;
sort(p,p+m,cmp);
for(int i=0;i<m;i++)
{
int fx=find(p[i].u);
int fy=find(p[i].v);
if(fx!=fy)
{
pre[fy]=fx;
ans+=p[i].value;
}
}
printf("%d\n",ans);
}
}
return 0;
}
D - 畅通工程
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int pre[111];
struct node
{
int u,v;
int value;
}p[111];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y)
{
return x.value<y.value;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int n,m,p1,p2;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0)
return 0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
}
sort(p,p+n,cmp);
int num=0,ans=0;
init(n);
for(int i=1;i<=n&&num<m-1;i++)
{
int fx=find(p[i].u);
int fy=find(p[i].v);
if(fx!=fy)
{
pre[fy]=fx;
num++;
ans+=p[i].value;
}
}
if(num==m-1)
{
printf("%d\n",ans);
}
else
{
printf("?\n");
}
}
return 0;
}
E - Highways
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct edge
{
double x,y;
}da[800];
struct node
{
int u,v;
double dis;
}e[320000+11];
struct edge2
{
int a,b;
}data[800];
int par[800],ran[800];
int vis[800][800];
int find(int m)
{
if(m==par[m])
return m;
else
return par[m]=find(par[m]);
}
void unite(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx==fy)
return ;
if(ran[fx]<ran[fy])
par[fx]=fy;
else
{
par[fy]=fx;
if(ran[fx]==ran[fy])
ran[fx]++;
}
}
bool cmp(node a,node b)
{
return a.dis <b.dis ;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
par[i]=i;
ran[i]=0;
}
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&da[i].x,&da[i].y);
}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
vis[a][b]=1,vis[b][a]=1;
unite(a,b);
}
int k=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
e[k].u =i;
e[k].v =j;
double a=da[i].x -da[j].x ;
double b=da[i].y -da[j].y ;
e[k].dis =sqrt(a*a+b*b);
k++;
}
}
sort(e,e+k,cmp);
int p=0;
for(int i=0;i<k;i++)
{
if(vis[e[i].u][e[i].v])
continue;
else
{
if(find(e[i].u)!=find(e[i].v))
{
data[p].a =e[i].u ;
data[p].b =e[i].v ;
vis[e[i].u][e[i].v]=vis[e[i].v][e[i].u]=1;
unite(e[i].u,e[i].v);
p++;
}
}
}
for(int i=0;i<p;i++)
{
printf("%d %d\n",data[i].a ,data[i].b );
}
}
return 0;
}
F - 畅通工程再续
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 99999
using namespace std;
int pre[MAX];
int n,m;
struct node
{
int x,y;
}p[1000];
struct node1
{
int x,y;
double distance;
}pi[751*751];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node1 x,node1 y)
{
return x.distance<y.distance;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
memset(pre,0,sizeof(pre));
init(n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
int s=0;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
pi[s].x =i;
pi[s].y =j;
pi[s++].distance=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
}
sort(pi,pi+s,cmp);
double ans=0;
for(int i=0;i<s;i++)
{
if(find(pi[i].x )!=find(pi[i].y)&&(pi[i].distance<=1000)&&(pi[i].distance>=10))
{
ans+=pi[i].distance;
mix(pi[i].x ,pi[i].y );
}
}
int flag=0;
for(int i=1;i<=n;i++)
{
if(pre[i]!=pre[1])
{
flag=1;
}
}
if(flag==1)
{
printf("oh!\n");
}
else
{
printf("%.1lf\n",ans*100);
}
}
return 0;
}
G - Agri-Net
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
int u,v;
int value;
}p[300000];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y)
{
return x.value<y.value;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int u,v;
while(scanf("%d",&n)!=EOF)
{
int s;
memset(pre,0,sizeof(pre));
int k=0;
init(n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&s);
p[k].u=i;
p[k].v=j;
p[k++].value=s;
}
}
int t;
/* scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d%d",&u,&v);
mix(u,v);
}*/
sort(p,p+k,cmp);
int dis=0;
for(int i=0;i<k;i++)
{
if(find(p[i].u)!=find(p[i].v))
{
dis+=p[i].value;
mix(p[i].u,p[i].v);
}
}
printf("%d\n",dis);
}
return 0;
}
H - Constructing Roads
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
int u,v;
int value;
}p[300000];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y)
{
return x.value<y.value;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int u,v;
while(scanf("%d",&n)!=EOF)
{
int s;
memset(pre,0,sizeof(pre));
int k=0;
init(n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&s);
p[k].u=i;
p[k].v=j;
p[k++].value=s;
}
}
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d%d",&u,&v);
mix(u,v);
}
sort(p,p+k,cmp);
int dis=0;
for(int i=0;i<k;i++)
{
if(find(p[i].u)!=find(p[i].v))
{
dis+=p[i].value;
mix(p[i].u,p[i].v);
}
}
printf("%d\n",dis);
}
return 0;
}
I - Jungle Roads
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int pre[27];
struct node
{
int u;
int v;
int distance;
}p[80];
bool cmp(node a, node b)
{
return a.distance < b.distance;
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
void init()
{
for(int i=0;i<27;i++)
{
pre[i]=i;
}
}
int main()
{
int n, k, distance, number, ans;
char start, end;
while(cin >> n, n)
{
memset(pre,0,sizeof(pre));
ans = k = 0;
init();
for(int i = 0; i < n- 1; i++)
{
cin >> start >> number;
for(int j = 0; j < number; j++)
{
cin >> end >> distance;
p[k].u = start - 'A';
p[k].v = end - 'A';
p[k++].distance = distance;
}
}
sort(p, p + k, cmp);
for(int i = 0; i < k; i++)
{
int x = find(p[i].u);
int y = find(p[i].v);
if(x != y)
{
ans = ans + p[i].distance;
pre[y] = x;
}
}
cout << ans << endl;
}
return 0;
}
J - Truck History
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 2000*2000
using namespace std;
int pre[MAX];
struct node1
{
char str[100];
}a[2001];
struct node
{
int u;
int v;
int distance;
}p[MAX];
bool cmp(node a, node b)
{
return a.distance < b.distance;
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
void init(int n)
{
for(int i=0;i<n;i++)
{
pre[i]=i;
}
}
int main()
{
int n;
// getchar();
while(scanf("%d",&n)!=EOF&&n!=0)
{
getchar();
init(n);
for(int i=0;i<n;i++)
{
gets(a[i].str);
}
int k=0;
for(int i=0;i<n-1;i++)
{
for(int j=i;j<n;j++)
{
int num=0;
p[k].u=i;
p[k].v=j;
for(int s=0;s<7;s++)
{
if(a[i].str[s]!=a[j].str[s])
{
num++;
}
}
p[k++].distance=num;
}
}
sort(p,p+k,cmp);
int ans=0;
for(int i = 0; i < k; i++)
{
int x = find(p[i].u);
int y = find(p[i].v);
if(x != y)
{
ans = ans + p[i].distance;
// printf("%d !!!\n",p[i].distance);
pre[y] = x;
}
}
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}
K - 最小生成树一·Prim算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define line cout<<"-------------------------"<<endl;
#define clr(a) memset(a,0,sizeof(a))
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int Mod = 1e9+7;
const int N = 1010;
int n,num;
ll ans ;
int mp[N][N],pre[MAXN];
struct node{
int u,v;
int cost;
}p[MAXN];
bool cmp (node a,node b){
return a.cost < b.cost;
}
void init(){
for(int i=0;i<=num;i++)
pre[i] = i;
}
int find(int x){
if(pre[x] == x) return x;
return pre[x] = find(pre[x]);
}
int main(){
while(scanf("%d",&n)!=EOF){
num = 0;
ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&mp[i][j]);
if(i > j){
p[num].u = i;
p[num].v = j;
p[num++].cost = mp[i][j];
}
}
}
sort(p,p+num,cmp);
init();
for(int i=0;i<num;i++){
int dx = find(p[i].u);
int dy = find(p[i].v);
if(dx != dy){
pre[dy] = dx;
ans += p[i].cost;
}
}
cout<<ans<<endl;
}
return 0;
}
L - 最小生成树二·Kruscal算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))
const int maxn = 1e6+10;
int n,m,ans;
int pre[maxn];
struct node{
int u,v;
int cost;
}p[maxn];
void init(){
for(int i=0;i<=n;i++)
pre[i] = i;
}
int find(int x){
if(x == pre[x]) return x;
return pre[x] = find(pre[x]);
}
bool cmp(node a,node b){
return a.cost < b.cost;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
clr(p);
ans = 0;
int u,v,cost;
init();
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&cost);
p[i].u = u;
p[i].v = v;
p[i].cost = cost;
}
sort(p,p+m,cmp);
for(int i=0;i<m;i++){
int dx = find(p[i].u);
int dy = find(p[i].v);
if(dx != dy){
ans += p[i].cost;
pre[dy] = dx;
}
}
cout<<ans<<endl;
}
return 0;
}