給定乙個n個點m條邊的有向圖,有k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。
第一行5個整數n、m、k、s、t,表示點個數、邊條數、標記點個數、起點編號、終點編號。
接下來m行每行3個整數x、y、z,表示有一條從x到y的長為z的有向邊。
接下來k行每行個整數表示標記點編號。
輸出乙個整數,表示最短距離,若沒有方案可行輸出-1。
3 3 2 1 1
1 2 1
2 3 1
3 1 1
23
3
路徑為1->2->3->1。
20%的資料n<=10。
50%的資料n<=1000。
另有20%的資料k=0。
100%的資料n<=50000,m<=100000,0<=k<=10,1<=z<=5000。
【解題思路】
模板題,最短路+dfs
【code】
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9using
namespace
std;
10const
int n=100005,m=15;11
long
long inf=0x7fffffffffffffff;12
using
namespace
std;
13int
n,m,k,s,t,flag[m],head[n],next[n],to[n],val[n],cnt;
14long
long f[m][m],d[n],ans=inf,sum;
15bool
visit[n],vis[m];
16 priority_queuelong
long,int>,vectorlong
long,int> >,greaterlong
long,int> > >q;
17void add(int x,int y,int
z)23
void dijkstra(int
s)27 memset(visit,0,sizeof
(visit));
28 d[s]=0;29
q.push(make_pair(d[s],s));
30while(!q.empty())
36 visit[x]=1;37
for(int i=head[x];i;i=next[i])43}
44}45}
46void dfs(int x,int
fa)51
for(int i=1;i<=k;i++)59}
60}61int
main()
69for(int i=1;i<=k;i++)
72for(int i=0;i<=k+1;i++)77}
78 dfs(0,0
);79
if(ans==inf)
82else
85return0;
86 }
遊戲 最短路,拆點
把問題抽象成圖論應該不難 也許都不用抽象?但是怎麼建邊怎麼跑就千差萬別了。首先應該注意到的一點是座標的範圍是0 500,也就是501 501個位置,所以陣列 佇列不要開小。另外題目給出的莉露露沒說位置不能重複,所以每個點可能不止入隊一次,仍然要注意陣列大小。剛開始一直在想複雜度與n掛鉤的演算法,但是...
Meeting(最短路 虛擬點)
思路這個題主要是建圖,建圖完成後,從 1 和 n 各自跑一遍dijkstra,分別得到從起點到各點的最短距離 a i 和 b i 然後用c i 來儲存從 1 和 n 出發的到 i 點距離的最大值 因為快的可以等慢的 同時維護乙個最小值答案 minn,最後再從小到大跑一遍看哪個點的 c i 與答案 m...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...