目录
一、第一代代码
这道题我起先只写了一个60分代码,代码如下:
#include<bits/stdc++.h>
using namespace std;
struct line_information
{
int need;
int from;
int to;
int value;
}line[10001];
int f[2001];
int n, m, il = 0;
bool cmpl(line_information a, line_information b)
{
return a.value < b.value;
}
int find(int i)
{
if(f[i] != i)
f[i] = find(f[i]);
return f[i];
}
int main()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
f[i] = i;
for(int i = 1; i <= m; i++)
{
int p, u, v, m;
scanf("%d %d %d %d", &p, &u, &v, &m);
il++;
line[il].need = p;
line[il].from = u;
line[il].to = v;
line[il].value= m;
}
sort(line+1, line+il+1, cmpl);
int ans = 0;
for(int i = 1; i <= il; i++)
{
// printf("%d ", line[i].value);
if(line[i].need == 1)
{
f[find(line[i].from)] = find(line[i].to);
ans += line[i].value;
}
if(find(line[i].from) != find(line[i].to))
{
f[find(line[i].from)] = find(line[i].to);
ans += line[i].value;
}
}
printf("%d", ans);
return 0;
}
二、第二代代码
然后,我把线路必选的判断放到了输入中,于是就100分了,代码如下:
#include<bits/stdc++.h>
using namespace std;
struct line_information
{
int need;
int from;
int to;
int value;
}line[10001];
int f[2001];
int n, m, il = 0;
bool cmpl(line_information a, line_information b)
{
return a.value < b.value;
}
int find(int i)
{
if(f[i] != i)
f[i] = find(f[i]);
return f[i];
}
int main()
{
int ans = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
f[i] = i;
for(int i = 1; i <= m; i++)
{
int p, u, v, m;
scanf("%d %d %d %d", &p, &u, &v, &m);
if(p == 1)
{
f[find(u)] = find(v);
ans += m;
}
il++;
line[il].need = p;
line[il].from = u;
line[il].to = v;
line[il].value= m;
}
sort(line+1, line+il+1, cmpl);
for(int i = 1; i <= il; i++)
{
// printf("%d ", line[i].value);
if(find(line[i].from) != find(line[i].to))
{
f[find(line[i].from)] = find(line[i].to);
ans += line[i].value;
}
}
printf("%d", ans);
return 0;
}
三、我的疑问
请问大佬们,这是为什么呢?