提交时间 | 状态 | 分数 | 题目 | 编译器 | 耗时 | 用户 |
---|---|---|---|---|---|---|
2018/11/27 21:06:13 | 部分正确 | 21 | 1013 | C++ (g++) | 9 ms | Dirichlet |
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 3 ms | 368KB |
1 | 答案正确 | 3 ms | 384KB |
2 | 答案正确 | 8 ms | 4480KB |
3 | 答案正确 | 9 ms | 4360KB |
4 | 运行超时 | 0 ms | 0KB |
题目大意:
在战争中是否所有城市均被高速公路相连接至关重要。当敌人攻占一座城市,所有通往该城市的路均被关闭。因此我们需要知道我们需要新建哪些路使得剩余所有城市相连接。给出所有城市及其所保留的公路,请计算需要新建几条公路。
输入格式:
包含一个测试用例,第一行三个数分别表示城市总数N,公路数M,被检查的城市数量K。接下来是M行,表示公路所连接的两个城市,城市标记1-N。最后一行给出K个数表示我们所关心的城市。(N小于等于1000)
输出格式:
输出K个数,显示每个城市被攻陷后需要修建的公路条数。
输入样例:
3 2 3
1 2
1 3
1 2 3
输出样例:
1
0
0
最初超时代码:
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1010;
struct Way{
int p1, p2;
};
int G[maxn][maxn]={0};
bool inq[maxn]={false};
vector<Way> W;
int numCity,numWay,numConcern;
void DFS(int u, int x){
inq[u]=true;
for(int i=1; i<=numCity; i++){
if(inq[i]==false && G[u][i]!=0)
DFS(i,x);
}
}
int DFSTraversal(int u){
memset(inq, false, sizeof(inq));
for(int i=1; i<=numCity; i++){//删除该点所有公路
G[u][i]=0;
G[i][u]=0;
}
int numConnected=0;
for(int i=1; i<=numCity; i++){
if(inq[i]==false && i!=u){
DFS(i,u);
numConnected++;
}
}
return numConnected;
}
void InitializeGraph(){
for(int i=0; i<W.size(); i++){
G[W[i].p1][W[i].p2]=1;
G[W[i].p2][W[i].p1]=1;
}
}
int main()
{
cin>>numCity>>numWay>>numConcern;
int p1,p2;
int concern;
int build[maxn]={0};
for(int i=0; i<numWay; i++){//读入公路
Way wp;
cin>>p1>>p2;
wp.p1=p1; wp.p2=p2;
W.push_back(wp);
}
for(int i=0; i<numConcern; i++){
cin>>concern;
InitializeGraph();
build[i]=DFSTraversal(concern);
}
for(int i=0; i<numConcern; i++){
printf("%d\n",build[i]-1);
}
return 0;
}