• 2012哈工程ACM暑期集训图论专场(练习赛第7场)题解


    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;
    }
  • 相关阅读:
    c语言中while循环
    c语言中while循环
    css元素重叠代码
    css指定裁剪区域代码
    css元素重叠代码
    css正常文档布局和元素可见性代码
    css元素浮动代码
    css指定裁剪区域代码
    css正常文档布局和元素可见性代码
    css元素浮动代码
  • 原文地址:https://www.cnblogs.com/markliu/p/2647316.html
Copyright © 2020-2023  润新知