题面是这个:
给出一个有向图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;
}
}