1001~1004比较简单,就不给大家题解了,做不出的再好好想想。

1005

View Code
#include <iostream>
#include <stdio.h>
using namespace std;
int parent[10005];
int find(int x){
    return x==parent[x] ? x : parent[x]=find(parent[x]);
}
int main(){
    int n,m,a,b;
    char q[2];
    int k=0;
    while(cin >> n >> m){
        printf("Case %d:\n",++k);
        for(int i=0;i<=n;i++){
            parent[i]=i;
        }
        for(int i=0;i<m;i++){
            scanf("%s",q);
            scanf("%d%d",&a,&b);
            if(q[0]=='C'){
                if(find(a)!=find(b))
                    parent[parent[a]]=b;
            }
            else{
                if(find(a)==find(b)) printf("yes\n");
                else printf("no\n");
            }
        }
    }
    return 0;
}

1006

View Code
#include <iostream>
#include <stdio.h>
using namespace std;
#define inf 100000000
int main(){
    int n,m,a,b,c,z=0;
    int map[105][105];
    while(cin >> n >> m){
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                map[i][j]=inf;

            }
            map[i][i]=0;
        }
        for(int i=0;i<m;i++){
            cin >> a >> b >> c;
            if(map[a][b]>c)//处理重边
                map[a][b]=c;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    if(map[i][j]>map[i][k]+map[k][j]){
                        map[i][j]=map[i][k]+map[k][j];
                    }
                }
            }
        }
        /*for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cout << map[i][j] <<" ";
            }
            cout << endl;
        }*/
        int maxc=-1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(maxc<map[i][j] && map[i][j]!=inf)
                    maxc = map[i][j];
            }
        }
        printf("Case %d:\n",++z);
        cout << maxc <<endl;
    }
    return 0;
}

1007

View Code
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int MAXN = 200;
int uN,vN;
bool g[MAXN][MAXN];
int xM[MAXN],yM[MAXN];
bool chk[MAXN];
int cntp,cntw;
bool dfs(int u)
{
    int v;
    for(v=cntp;v<cntw;v++)
    {
        if(g[u][v] && !chk[v])
        {
            chk[v]=true;
            if(yM[v]==-1 || dfs(yM[v]))
            {
                yM[v]=u;
                xM[u]=v;
                return true;
            }
        }
    }
    return false;
}
int MaxMatch()
{
    int u,ret=0;
    memset(xM,-1,sizeof(xM));
    memset(yM,-1,sizeof(yM));
    for(u=0;u<cntp;u++)
    {
        if(xM[u]==-1)
        {
            memset(chk,false,sizeof(chk));
            if(dfs(u)) ret++;
        }
    }
    return ret;
}
int main()
{
    int n,m;
    char map[MAXN][MAXN];
    int vis[MAXN][MAXN];
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    while(cin >> n >> m)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s",map[i]);
        }
        cntp=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(map[i][j]=='P')
                {
                    vis[i][j]=cntp++;
                }
        }
        cntw=cntp;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(map[i][j]=='W'){
                    vis[i][j]=cntw++;
                }
            }
        }
        memset(g,0,sizeof(g));
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(map[i][j]=='P')
            {
                for(int k=0;k<4;k++)
                {
                    int x=i+dir[k][0];
                    int y=j+dir[k][1];
                    if(map[x][y]=='W' && x>=0 && x<n && y>=0 && y<m)
                    {
                        g[vis[i][j]][vis[x][y]]=1;
                    }
                }
            }
        }
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(map[i][j]=='W')
            {
                for(int k=0;k<4;k++)
                {
                    int x=i+dir[k][0];
                    int y=j+dir[k][1];
                    if(map[x][y]=='P' && x>=0 && x<n && y>=0 && y<m)
                    {
                        g[vis[i][j]][vis[x][y]]=1;
                    }
                }
            }
        }
        printf("%d\n",MaxMatch());
    }
    return 0;
}

1008

View Code
#include <iostream>
#define inf 1000000000
using namespace std;
int main(){
    int n,m,a,b,c;
    int map[105][105];
    while(cin >> n >> m){
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                map[i][j]=inf;
            }
            map[i][i]=0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin  >> c;
                if(c<map[i][j]) map[i][j]=c;
                if(c<map[j][i]) map[j][i]=c;
            }
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j) continue;
                    if(map[i][j]>map[i][k]+map[k][j]){
                        map[i][j]=map[i][k]+map[k][j];
                    }
                }
            }
        }
        /*for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cout << map[i][j] <<" ";
            }
            cout << endl;
        }*/
        for(int i=0;i<m;i++){
            cin >> a >> b;
            cout << map[a][b] <<endl;
        }
    }
    return 0;
}

1009

View Code
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define INF 1000000000
#define MAXN 505
int n,m;
double Edge[MAXN][MAXN];
double lowcost[MAXN];
int nearvex[MAXN];
struct Edge{
    int u,v;
}p[505];
int k=0;
void prim(int u){

    double maxc=-1;
    for(int i=1;i<=n;i++){
        lowcost[i]=Edge[u][i];
        nearvex[i]=u;
    }

    nearvex[u]=-1;
    for(int i=1;i<n;i++){
        double min=INF;
        int v=-1;
        for(int j=1;j<=n;j++){
            if(nearvex[j]!=-1 && lowcost[j]<min){
                v=j;
                min=lowcost[j];
            }
        }
        if(v!=-1){
            if(lowcost[v]>maxc)
                maxc=lowcost[v];
            nearvex[v]=-1;
            for(int j=1;j<=n;j++){
                if(nearvex[j]!=-1 && Edge[v][j]<lowcost[j]){
                    lowcost[j]=Edge[v][j];
                    nearvex[j]=v;
                }
            }
        }
    }
    printf("Case %d:\n",++k);
    printf("%.2lf\n",maxc/2.0);
}
int main(){
    int a[505][2];
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%d%d",&p[i].u,&p[i].v);
        }

        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                Edge[i][j]=INF;
            }
            Edge[i][i]=0;
        }
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                Edge[j][i]=Edge[i][j]=sqrt((double)(p[i].u-p[j].u)*(double)(p[i].u-p[j].u)+(double)(p[i].v-p[j].v)*(double)(p[i].v-p[j].v));
            }
        }
        prim(1);
    }
    return 0;
}

1010

View Code
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main(){
    int n;
    long long a;
    double sum;
    char s[5000];
    while(cin >> n){
        sum=0;
        for(int i=0;i<n;i++){
            cin >> a;
            sum += a;
        }
        sum/=6.0;
        sprintf(s,"%.2lf",sum);
        //cout << s <<endl;
        int len=strlen(s);
        if(s[len-1]!='0') cout << s[len-1];
        for(int i=len-2;i>=0;i--){
            cout << s[i] ;
        }
        cout <<endl;
    }
    return 0;
}