图的基本存储的基本方式三

来源:互联网 发布:淘宝排名查询助手 编辑:程序博客网 时间:2024/05/18 01:22

Problem Description

解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么?

Input

多组输入,到文件结尾。

每一组第一行有两个数nm表示n个点,m条有向边。接下来有m行,每行两个数uvw代表uv有一条有向边权值为w。第m+2行有一个数q代表询问次数,接下来q行每行有一个询问,输入一个数为a

注意:点的编号为0~n-12<=n<=5000000<=m<=5000000<=q<=500000,u!=vwint型数据。输入保证没有自环和重边

Output

对于每一条询问,输出一行两个数xy。表示排序后第a条边是由xy的。对于每条边来说排序规则如下:
  1. 权值小的在前。

  2. 权值相等的边出发点编号小的在前

  3. 权值和出发点相等的到达点编号小的在前

注:边的编号自0开始

Example Input

4 30 1 11 2 21 3 03012

Example Output

1 30 11 2
 
#include<stdio.h>struct node{    int u,v,w;}a[500005];void qqsort(int left,int right){    int i,j,m1,m2,m3;    struct node  m;    i=left;j=right;    m1=a[i].u;m2=a[i].v;m3=a[i].w;    m=a[i];    if(i>=j)        return ;    while(i<j)    {        while(i<j&&(a[j].w>m3||(a[j].w==m3&&a[j].u>m1)||(a[j].w==m3&&a[j].u==m1&&a[j].v>=m2)))            j--;        a[i]=a[j];        while(i<j&&(a[i].w<m3||(a[i].w==m3&&a[i].u<m1)||(a[i].w==m3&&a[i].u==m1&&a[i].v<=m2)))            i++;        a[j]=a[i];    }    a[i]=m;    qqsort(left,i-1);    qqsort(j+1,right);}int main(){    int i,n,m,q,b;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<m;i++)        {            scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);        }        qqsort(0,m-1);        scanf("%d",&q);        while(q--)        {            scanf("%d",&b);            printf("%d %d\n",a[b].u,a[b].v);        }    }    return 0;}
0 0
原创粉丝点击