PAT Head of a Gang

题目大意:对于一个给定的无向图,求出所有的连通分量。还有连通分量中包含的信息:head和总点数。一个连通分量的总边长要大于阈值才合法,head是一个连通分量中相邻边总长度最大的点。输出顺序要按照字典序(姓名)。

思路:采用BFS或DFS都可以求出连通分量。字符串到id映射直接用Map就可以了。注意是无向图,两个点之间不同方向的边算一条边(边长等于两边之和)。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll __int64
using namespace std;
const int INF=0x3fffffff;

int n,M,k;
int g[2005][2005];
bool vis[2005][2005]; //标记边
bool vd[2005];//标记点
char name[2005][5];
int sum;//每个连通分量中的点数
int sumTime;//每个连通分量中总通话时间
int head;//每个连通分量中相邻点数最多的点
struct Gang{
    char x[5];
    int num;
    friend bool operator <(Gang g1,Gang g2){
        return strcmp(g1.x,g2.x)<0;
    }
}gang[2005];//保存每个连通分量信息(head和sum)

void bfs(int x)
{
    int maxCnt=0;
    queueq;
    q.push(x);
    sum++;
    vd[x]=true;
    while(!q.empty()){
        int s=q.front();
        q.pop();
        int cnt=0;
        for(int i=1;imaxCnt){
            maxCnt=cnt;
            head=s;
        }
    }
}

int main()
{
    //freopen("d:\\Test.txt","r",stdin);
    mapm;
    scanf("%d%d",&M,&k);
    n=1;
    for(int i=0;i2&&sumTime>k){
                strcpy(gang[t].x,name[head]);
                gang[t].num=sum;
                t++;
            }
        }
    }
    printf("%d\n",t);
    sort(gang,gang+t);
    for(int i=0;i


你可能感兴趣的:(PAT)