1013. Battle Over Cities (25)

#include<iostream>
#include<vector>
using namespace std;
vector<int> kkk;
int N,M,K;
int n;
bool temp[1002];
bool visited[1002];

typedef struct ArcNode{
    struct ArcNode *next;
    int adj;
}ArcNode;
//vector<ArcNode> arc;
ArcNode arc[1000000];
vector<ArcNode *> vexarc; 

typedef struct VNode{
    int name;
    ArcNode *first;
}VNode;
typedef struct{
    int arcnum,vexnum;
    VNode vs[1002];
}LGraph;

bool CreateLG(LGraph &G)
{
    cin>>N>>M>>K;
    G.arcnum=M;
    G.vexnum=N;
    for(int t=0;t<G.vexnum;t++)
    {
        G.vs[t].name=t+1;
        G.vs[t].first=NULL;
        vexarc.push_back(G.vs[t].first);
        visited[t]=false;
    }
    for(int t=0;t<G.arcnum;t++)
    {
        int a,b;
        cin>>a>>b;
        arc[2*t].adj=a-1;arc[2*t].next=NULL;
        arc[2*t+1].adj=b-1;arc[2*t+1].next=NULL;
    //  hu.adj=a-1;hu.next=NULL;arc.push_back(hu);
    //  hu.adj=b-1;hu.next=NULL;arc.push_back(hu);
        if(G.vs[a-1].first==NULL) G.vs[a-1].first=vexarc[a-1]=&arc[2*t+1];
        else vexarc[a-1]=vexarc[a-1]->next=&arc[2*t+1];
        if(G.vs[b-1].first==NULL) G.vs[b-1].first=vexarc[b-1]=&arc[2*t];
        else vexarc[b-1]=vexarc[b-1]->next=&arc[2*t];
    }
    for(int t=0;t<K;t++)
    {
        int k;
        cin>>k;
        k--;
        kkk.push_back(k);
        //visited[k]=false;
    }

    return true;
}

bool bfs(LGraph &G,VNode f)
{
    ArcNode *p=f.first;
    temp[f.name-1]=true;
    while(p!=NULL)
    {
        if(!temp[p->adj]) bfs(G,G.vs[p->adj]);
        p=p->next;
    }
    return true;

}
int main()
{
    LGraph G;
    CreateLG(G);


    for(vector<int>::iterator it=kkk.begin();it!=kkk.end();it++)
    {
        for(int t=0;t<G.vexnum;t++)
            temp[t]=visited[t];
        temp[*it]=true;
        n=0;
        for(int t=0;t<G.vexnum;t++)
        {if(!temp[t]) {bfs(G,G.vs[t]);n++;}}
        if(n>0) cout<<n-1<<endl;
        else cout<<" "<<endl;
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值