解決圖論問題,首先就要思考用什么樣的方式存儲圖。但是小鑫卻怎么也弄不明白如何存圖才能有利于解決問題。你能幫他解決這個問題么?
每一組第一行有兩個數n、m表示n個點,m條有向邊。接下來有m行,每行兩個數u、v、w代表u到v有一條有向邊權值為w。第m+2行有一個數q代表詢問次數,接下來q行每行有一個詢問,輸入一個數為a
注意:點的編號為0~n-1,2<=n<=500000,0<=m<=500000,0<=q<=500000,u!=v,w為int型數據。輸入保證沒有自環和重邊
權值小的在前。
權值相等的邊出發點編號小的在前
權值和出發點相等的到達點編號小的在前注:邊的編號自0開始
4 30 1 11 2 21 3 03012Example Output
1 30 11 2#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#include<math.h>#include<set>using namespace std;struct node{ int a,b,c;//a初始點b終點c權值} head[500002];void qsort(int l,int r)//快排{ int i=l,j=r; struct node key;//結構體變量 key=head[i]; if(l>=r) return ; while(i<j) { while(i<j&&(key.c<head[j].c||(key.c==head[j].c&&key.a<head[j].a)||(key.c==head[j].c&&key.a==head[j].a&&key.b<head[j].b))) { j--; } head[i]=head[j]; while(i<j&&(key.c>head[i].c||(key.c==head[i].c&&key.a>head[i].a)||(key.c==head[i].c&&key.a==head[i].a&&key.b>head[i].b))) { i++; } head[j]=head[i]; } head[i]=key; qsort(l,i-1); qsort(i+1,r);}int main(){ int m,n,i,x,q; while(cin>>n>>m) { for(i=0; i<m; i++) { cin>>head[i].a>>head[i].b>>head[i].c; } qsort(0,m-1); cin>>x; for(i=0; i<x; i++) { cin>>q; cout<<head[q].a<<' '<<head[q].b<<endl; } } return 0;}
新聞熱點
疑難解答