今天打算做做图论,但有道题我卡在那了(全WA)
  • 板块灌水区
  • 楼主gdjcwsk
  • 当前回复24
  • 已保存回复24
  • 发布时间2020/4/28 22:15
  • 上次更新2023/11/7 03:43:55
查看原帖
今天打算做做图论,但有道题我卡在那了(全WA)
243024
gdjcwsk楼主2020/4/28 22:15

题面是这个:

给出一个有向图G(无重边/自环),请你构造这个图G2。

*如果在原图G中存在的2条有向边<u,v>和<v,w>, 则G2中存在有向边<u,w>,即G2中的边对应于G中恰走两步可以到达的点对。

输入格式 第一行包含2个整数N、M,表示该图共有N个结点和M条有向边。(N <= 500,M <= 100000)

接下来M行,每行包含3个整数{u,v,w},表示有一条长度为w的有向边<u,v>,u指向v。

输出格式 N行,G2的邻接表。如果对于某个顶点i,没有出边,输出空行。

输入输出样例

输入 #1

4 4

1 2 2

1 4 1

2 3 4

3 1 3

输出 #1

(1,3)

(2,1)

(3,2) (3,4)

#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
int u[maxn],v[maxn],w[maxn],cnt;
priority_queue<int,vector<int>,greater<int> >q[maxn],a[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>u[i]>>v[i]>>w[i];
        a[u[i]].push(v[i]);
    }
    for(int i=1;i<=m;i++)
    {
        while(!a[v[i]].empty())
        {
            if(a[v[i]].top()!=u[i])
            {
                q[u[i]].push(a[v[i]].top());
            }
            a[v[i]].pop();
        }
    }
    for(int i=1;i<=n;i++)
    {
        while(q[i].empty()==0)
        {
            cout<<"("<<i<<","<<q[i].top()<<") ";
            q[i].pop();
        }
        cout<<endl;
    }
}
2020/4/28 22:15
加载中...