| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:怎么过不了,老是wrong 想看看牛人怎么写的In Reply To:怎么过不了,老是wrong 想看看牛人怎么写的 Posted by:lagrange at 2005-05-03 01:08:55 我是贪心做的,每次找最短边接起来,然后不停的floyd-warshall去掉不需要的边
> #include <stdio.h>
> #define MAXN 101
> int n,q,xx[MAXN][MAXN];
>
> void conn(int a,int b)
> {
> int i,j,i0,j0,temp;
> if (a<b)
> {temp=a;a=b;b=temp;}
> for(i=1;i<=n;i++)
> {
> xx[b][i]=((xx[a][i]<xx[b][i])?xx[a][i]:xx[b][i]);
> xx[i][b]=((xx[i][a]<xx[i][b])?xx[i][a]:xx[i][b]);
> }
> for(i=a;i<=n-1;i++)
> for(j=1;j<=n;j++)
> xx[i][j]=xx[i+1][j];
> for(i=1;i<=n-1;i++)
> for(j=a;j<=n-1;j++)
> xx[i][j]=xx[i][j+1];
> n--;
> }
>
> void input()
> {
> int i,j,a,b;
> scanf("%d",&n);
> for(i=1;i<=n;i++)
> {
> for(j=1;j<=n;j++)
> scanf("%d",&xx[i][j]);
> }
> scanf("%d",&q);
> for(i=1;i<=q;i++)
> {
> scanf("%d%d",&a,&b);
> conn(a,b);
> }
> }
>
> int solve()
> {
> int i,j,ci,cj,y,min;
> y=0;
> while(n!=1)
> {
> min=10000;
> for(i=1;i<=n;i++)
> for(j=1;j<=n;j++)
> if(xx[i][j]<min&&i!=j)
> {
> min=xx[i][j];
> ci=i;cj=j;
> }
> y+=xx[ci][cj];
> conn(ci,cj);
> }
> return y;
> }
>
> main()
> {
> input();
> printf("%d\n",solve());
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator