UVA 12717 Fiasco

来源:互联网 发布:知乎数据接口 编辑:程序博客网 时间:2024/05/21 15:03

题意:看懂给出的伪代码功能,然后根据所给的一组数据,将数据改造成伪代码可以执行出正确代码的一套数据

这个题的主要问题在于看懂题意,看懂题之后会发现伪代码的功能是按照连通性选择到达当前节点的最小值,而不是和,所以完全可以借用BFS跑一遍所有的点,再把边权按照先后顺序依次填充即可

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<queue>using namespace std;typedef pair<int,int> P;const int maxn=2500+7;int n,m,s;int d[maxn][maxn],vis[maxn];vector<int> g[maxn],dis;vector<P> input;void work(int s){    memset(vis,0,sizeof(vis));    queue<int> q;    q.push(s);    int k=0;    while(!q.empty())    {        int x=q.front();        q.pop();        if(vis[x]) continue;        vis[x]=1;        int vs=g[x].size();        for(int i=0; i<vs; i++)        {            int v=g[x][i];            if(vis[v]) continue;            d[x][v]=d[v][x]=dis[k++];            q.push(v);        }    }}int main(){    int T;    scanf("%d",&T);    for(int kas=1; kas<=T; kas++)    {        scanf("%d%d%d",&n,&m,&s);        dis.clear();        input.clear();        for(int i=1; i<=n; i++) g[i].clear();        for(int i=1; i<=m; i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            g[u].push_back(v);            g[v].push_back(u);            dis.push_back(w);            input.push_back(P(u,v));        }        sort(dis.begin(),dis.end());        work(s);        printf("Case %d:\n",kas);        for(int i=0; i<m; i++)        {            int u,v,w;            u=input[i].first;            v=input[i].second;            w=d[u][v];            printf("%d %d %d\n",u,v,w);        }    }    return 0;}


0 0
原创粉丝点击