#include<bits/stdc++.h> #define N 200005 #define edge pair<int, pair<int, int> > #define u first #define v second.first #define w second.second #define int long long usingnamespace std;
//確認是一個有相無環圖 拓樸排序 intmain(){ ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--){ int deg[100006]; vector<int> arr[100006]; priority_queue<int, vector<int>, greater<int> > Q; queue<int> ans; memset(deg, 0, sizeof(deg)); int n, m; cin >> n >> m; //由兩個整數 a 和 b ( 0 ≤ a , b ≤ n − 1 )組成, //代表要攻破陣地 b 之前必須先攻破陣地 a ,其中陣地從 0 ~ n − 1 依序編號。 for(int i = 0, a, b; i<m; i++) cin>>a>>b, arr[a].push_back(b), deg[b]++; for(int i = 0; i<n; i++) if(deg[i]==0) Q.push(i);
#include<bits/stdc++.h> #define N 101 #define pii pair<int, int> #define w first #define p second #define int long long usingnamespace std;
signedmain(){ ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--){ // N代表可魚國內有幾個城市, M代表墨魚運輸公司提供幾種運輸方案 // S , E 分別代表你的工廠所在的城市以及你所要送去的城市。 // F 代表那隻富有的大可魚訂購了多少箱的可魚果。 int n,m,s,e,f; vector<pii> P[N]; cin>>n>>m>>s>>e>>f; //一定是全部一起送去最便宜 //邊權即送f過去的價錢 for(int i = 0; i<m; i++){ int a, b, c, d , cc, w; //每個方案 P i 會從一個固定的起始城市 A i 運送東西到另一個固定的終點城市 B i //,每運輸一箱的可魚果,你就必須付給墨魚運輸公司 C i 可魚幣。另外, //若兩個方案的終點與起點相接,則可以不花任何額外費用的將貨物轉過去。不過由於你的運輸量太大了, //墨魚運輸公司決定祭出優惠,若用方案 P i 運輸了超過 D i 箱的可魚果, //多出來的部份每箱改收優惠價 C i ′ 可魚幣。 cin >> a >>b >>c >> d >>cc; if(f<=d) w = c*f; else w = c*d+(f-d)*cc; P[a].push_back(make_pair(w, b)); } priority_queue<pii,vector<pii>,greater<pii> > Q;//排序要看全中 所以w要在前面 Q.push(make_pair(0, s)); bool vis[N]; int d[N]; for(int i = 0; i<N; i++) d[i] = 1e18; d[s] = 0; memset(vis, 0, sizeof(vis)); while(!Q.empty()){ int pt = Q.top().p; Q.pop(); if(!vis[pt]){ for(pii i: P[pt]){ int nP = i.p, nW = i.w; if(d[pt]+nW < d[nP]){ d[nP] = d[pt]+nW; Q.push(make_pair(d[nP],nP)); } } vis[pt] = true; } } cout<<d[e]<<endl; } return0; }
#include<bits/stdc++.h> #define MAX 500005 #define INF 1e18 #define int long long #define pii pair<int, int> #define weight first #define val second typedeflonglong LL; usingnamespace std; //城市、軌道、改的數量 int n,m,q; vector< pii > ahead[MAX]; vector< pii > back[MAX]; int ahead_dis[MAX], back_dis[MAX];
/* 先建一條1->n的最短路 在把箭頭反過來建一條n->1的 新建的路是a->b 最後球1->n 跟 1->a + a->b + b->n 誰比較小誰就是答案 */ signedmain() { ios::sync_with_stdio(0); cin.tie(0); memset(ahead_dis, 0, sizeof(ahead_dis)); memset(back_dis, 0, sizeof(back_dis)); cin >> n >> m >>q; for(int i = 0; i<m; i++){ int a,b,w; cin >> a >> b >> w; ahead[a].push_back(make_pair(w,b)); back[b].push_back(make_pair(w,a)); } for(int i = 0 ;i<MAX;i++){ ahead_dis[i] = INF, back_dis[i] = INF; } ahead_dis[1] = 0, back_dis[n] = 0; bool visA[MAX], visB[MAX]; memset(visA, 0, sizeof(visA)); memset(visB, 0, sizeof(visB)); priority_queue<pii, vector<pii>, greater<pii> > QA; priority_queue<pii, vector<pii>, greater<pii> > QB; QA.push( make_pair(0,1)); QB.push( make_pair(0,n)); while(!QA.empty()){ int cur = QA.top().val; QA.pop(); if(!visA[cur]){ for(pii i : ahead[cur]){ int v = i.val, w= i.weight; if(ahead_dis[cur]+w < ahead_dis[v]){ ahead_dis[v] = ahead_dis[cur]+w; QA.push(make_pair(ahead_dis[v],v)); } } visA[cur] = true; } } while(!QB.empty()){ int cur = QB.top().val; QB.pop(); if(!visB[cur]){ for(pii i : back[cur]){ int v = i.val, w= i.weight; if(back_dis[cur]+w < back_dis[v]){ back_dis[v] = back_dis[cur]+w; QB.push(make_pair(back_dis[v],v)); } } visB[cur] = true; } } while(q--){ int a, b; cin >> a >> b; int ori = ahead_dis[n]; int aft = ahead_dis[a]+1+back_dis[b]; cout << min(ori, aft) << '\n'; } return0; }