C++ 资本流动|竞争性规划

C++ 资本流动|竞争性规划,c++,algorithm,performance,time-complexity,space-complexity,C++,Algorithm,Performance,Time Complexity,Space Complexity,问题 假设一个国家有n个城市,其中一个是首都。所有城市都通过“n-1”道路相连,可以使用这些道路在任何两个城市之间行驶。问题中提供了城市人口Pi 现在如果一个城市感染了病毒,与该城市相连的城市也会受到感染。在感染的情况下,选择一个新的资本。人口最多的未受感染城市成为新首都 输入 输入的第一行包含一个整数T,表示测试用例的数量。T测试用例的描述如下 每个测试用例的第一行包含一个整数N,表示城市的数量 下一行包含N个空间分隔的整数P1、P2、…、PN,表示每个城市的人口 接下来的N-1行包含两个空格

问题

假设一个国家有n个城市,其中一个是首都。所有城市都通过“n-1”道路相连,可以使用这些道路在任何两个城市之间行驶。问题中提供了城市人口Pi

现在如果一个城市感染了病毒,与该城市相连的城市也会受到感染。在感染的情况下,选择一个新的资本。人口最多的未受感染城市成为新首都

输入

输入的第一行包含一个整数T,表示测试用例的数量。T测试用例的描述如下

每个测试用例的第一行包含一个整数N,表示城市的数量

下一行包含N个空间分隔的整数P1、P2、…、PN,表示每个城市的人口

接下来的N-1行包含两个空格分隔的整数,每个V和U表示城市V和U之间有一条路

输出

对于每个测试用例,输出一行,其中包含N个整数A1、A2、…,用空格分隔。在这里,Ai指的是被选为新首都的城市数量,以防感染开始从城市i扩散。如果感染影响所有城市,则输出0

示例

输入:

一,

六,

510152530

13

2 3

34

4.5

4.6

输出:

66265

<强>我的C++解决方案<强> < /P>

#include <iostream>
#include <vector>
#include <list>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main() {
    int t;
    scanf("%d", &t); //No. of test cases
    while(t--) {
        int n;
        scanf("%d", &n);
        vector<int> p(n);   //vector for storing population of each city
        for(int i = 0; i < n; i++)
            scanf("%d", &p[i]);

        vector<list<int> > graph(n); //vector of lists for storing connection between cities


        for(int i = 0; i < n-1; i++) { 
            int a, b;
            scanf("%d %d", &a, &b);
            graph[--a].push_back(--b);
            graph[b].push_back(a);
        }

        for(int i = 0; i < n; i++) {
            vector<int> temp = p;             //Temporary vector 

        /*All the infected cities are assigned a population
          of -1 so that they don't compete to become the largest capital*/

            temp[i] = -1;
            if(graph[i].size() == n-1) {//Printing "0" if all cities have connection with the infected city.
                cout<<"0 ";
                continue;
            }
            int s = graph[i].size();
            for(int j = 0; j < s; j++) {
                temp[graph[i].front()] = -1;
                graph[i].pop_front();
            }

            /*Finding max. population*/
            int maxindex = std::distance(temp.begin(), std::max_element(temp.begin(), temp.end()));

            printf("%d ", maxindex+1);
        }
        printf("\n");
    }
    return 0;
} 
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int t;
scanf(“%d”,&t);//测试用例的数量
而(t--){
int n;
scanf(“%d”和“&n”);
向量p(n);//存储每个城市人口的向量
对于(int i=0;icout因为没有关于“更大的输入”意味着什么的信息,我猜它指的是有更多的城市。在这种情况下,你正在制作一个巨大的(nxn)图形数组,这将导致更多的内存被占用,同时(大部分)是空的,因为只有n-1条道路。

考虑将城市与STD::列表,然后只看不在同一个被感染城市列表中的城市。< /P> < P>解决的办法是:<强>城市的人口分类< /强>预先。< /P>
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
bool myfnc(第i对、第j对){
返回i.first>j.first;
}
int main(){
int t;
scanf(“%d”、&t);
而(t--){
int n,d;
scanf(“%d”和“&n”);
向量p(n);
int m=0,mi=0;
对于(int i=0;i
当图形占用更多内存时,它也会给出O(1)了解哪些城市将受到特定城市病毒的感染。如果是列表,时间复杂度将是线性的。@Gyanshu:目前,您正在检查每个城市是否连接。查看连接城市的列表将花费较少的时间。@Kundor您可能是对的,但它是否会影响时间复杂度,因为e在最坏的情况下,受感染的城市可能与其他所有城市相连。@Gyanshu:在这种情况下,通过连接城市列表中的所有n个城市与通过所有n个城市一样,就像你已经在做的一样。@Kundor知道了,你们都是对的。让我检查一下改变是否解决了我的问题。请接受这个任务。你的任务ion似乎与我无关。你在找一个@Gyanshu吗?你应该编辑你的代码,将数据硬编码到你的程序中。如果你发布的是测试数据,则不需要调用
scanf
。这允许愿意帮助的其他人轻松复制和粘贴你的代码并运行它,而无需每次都输入数据还有我。@Gyanshu,为什么有这么多循环来复制数据呢?这个:
for(int j=0;j
就是这个:
temp=p;
。没有任何
for
loop@Gyanshu另外
maxindex=std::distance(temp.begin(),std::max_元素(temp.begin(),temp.end());
——无需循环来计算maxindex(因此,
max
)@PaulMcKenzie虽然您提到的这两件事都会稍微缩短我的代码,但它不会影响我的代码在执行时所占用的时间或空间。