今天上午本来在做队列剩下的题、但是老师后来说不用做了。。那个题实在太麻烦了、也没有什么价值、然后我就果断删掉了、、正好看着题解,也做得怪难受的、、
然后就看树状数组的课件、不看课件真的不会做题、看的也还不是十分理解。。思路感觉理解的还可以、代码实现还实现不了
今天下午,练习赛。。做题做的生无可恋,一共A了两道题,第一题,光搜题,再加一层找到4否的判断就可以了。。跟以前的广搜题很类似、
还有最后一个规律题、、一开始,看题没有注意到保留最后九位数就好,一门心思光再找规律。。后来好不容易找到了、一交,WA。。还以为是自己的规律找错了。。后来实在是A不了题了,再加上这个题A的人实在是多。。就继续看。。尝试大数发现输出错误。。然后又回去看题,终于看到了保留后九位,然后。。才A
BC题,我真的是醉了!!不就是最小生成树么?不是这个假期刚做的图论!??!我明明用的一样的方法。。搞不懂,为什么一直WA。。、
后来晚上我又好一通琢磨,都找出原来的代码来了。。改了一下输出,还是WA。。看来是方法错了!然后就搜题解,题解上是跟老师的课件上一种方法——从最小的边开始选择,将联通的路赋相同值。。这种方法确实学过。。但是原来做题用的方法也确实对啊!!
而且我记得有一个题,跟C的题意完全一样,也是找最短路径的最长边。。当时明明是A了的,这次在用。。就WA。。郁闷!!还没想通,两种方法差在哪里。。
最后时间不早了。。就看了一下DE的题意,E题类似。。D题有点难度,一时半会还不知道怎么做。。明天的任务了
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 2100;
const int MAXM = 40040;
struct EdgeNode
{
int from;
int to;
int w;
}Edges[MAXM];
int father[MAXN];
int find(int x)
{
if(x != father[x])
father[x] = find(father[x]);
return father[x];
}
int cmp(EdgeNode a,EdgeNode b)
{
return a.w < b.w;
}
void Kruskal(int N,int M)
{
sort(Edges,Edges+M,cmp);
int Count = 0, Max = 0;
for(int i = 0; i < M; ++i)
{
int u = find(Edges[i].from);
int v = find(Edges[i].to);
if(u != v)
{
father[v] = u;
Count++;
if(Max < Edges[i].w)
Max = Edges[i].w;
if(Count == N-1)
break;
}
}
cout << Max << endl;
}
int main()
{
int N,M;
while(~scanf("%d%d",&N,&M))
{
for(int i = 1; i <= N; ++i)
father[i] = i;
for(int i = 0; i < M; ++i)
{
scanf("%d%d%d",&Edges[i].from, &Edges[i].to, &Edges[i].w);
}
Kruskal(N,M);
}
return 0;
}
WA代码:
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define inf 9999999
using namespace std;
int N,M,a[2100][2100];
int C,F,P,poit[2100],look[2100],s=0;
int main()
{
int i,j,k,x,y,z;
while(cin>>N>>M)
{memset(poit,9999999,sizeof(poit));
memset(a,9999999,sizeof(a));
memset(look,0,sizeof(look));
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(a[x][y]>z)
{a[x][y]=z;
a[y][x]=z;}
}
for(i=1;i<=N;i++)
{
poit[i]=a[1][i];
}
s=0;
for(k=1;k<=N;k++)
{int z=-1,x=99999999;
for(i=1;i<=N;i++)
if(look[i]==0&&poit[i]<x)
{
x=poit[i];
z=i;
}
if(z==-1) break;
look[z]=1;
if(s<x) s=x;
for(i=1;i<=N;i++)
{
if(a[z][i]<poit[i])
{
poit[i]=a[z][i];
}
}
}
cout<<s<<endl;
}
}