hdu - 1595 find the longest of the shortest
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
inline
intread()
while
(ch>=
'0'&&ch<=
'9') s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}const
int maxn =
1e3+5;
int n,m;
int dis[maxn]
,pre[maxn]
,par[maxn]
;int e[maxn]
[maxn]
;bool vis[maxn]
,flag=
false
;void
dijskra
(int s)
vis[node]
=true;}
if(!flag)
}/* 題意:求最長最短路
* 分析:列舉每一邊進行刪減,每次再跑dijskra ,再取max即可
*/int
main()
int ans=
-inf,q=n;
flag=
false
;dijskra(1
);if(dis[n]
!=inf) ans=
max(dis[n]
,ans)
;while
(pre[q]!=-
1)// pre儲存的是最短路每一條邊,相當於路徑回溯過程
printf
("%d\n"
,ans);}
return0;
}
hdu - 3986 harry potter and the final battle
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
inline
intread()
while
(ch>=
'0'&&ch<=
'9') s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}const
int maxn =
1e3+5;
/*題意跟上一題差不多,需要考慮重邊,這題樸素dijskra跑肯定是t的,所以選擇了堆優化
* 我們需要記錄重邊,然後再列舉
*/int n,m;
int dis[maxn]
,pre[maxn]
,par[maxn]
,tot;
int e[maxn]
[maxn]
;bool vis[maxn]
,flag=
false
;struct edgeedge[
200005];
struct node};
int head[maxn]
;void
add_edge
(int u,
int v,
int w)
int cnt;
void
dijskra
(int s));
while
(!q.
empty()
));}
}}if(
!flag)
}void
spfa
(int s)
// spfa:佇列優化對鄰接矩陣更加友好吧}}
}int vise[maxn]
[maxn]
;int
main()
else
if(vise[u]
[v]>w)
}for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(e[i]
[j]!=inf)
add_edge
(i,j,e[i]
[j])
;int ans=inf;
flag=
false
;dijskra(1
);ans=dis[n];if
(dis[n]
==inf)
int q=n;
while
(pre[q]!=-
1)if(ans==inf)
printf
("-1\n");
else
printf
("%d\n"
,ans);}
return0;
}
記錄路徑:
codeforces c. dijkstra?
題意:求1
~n的最短路,輸出最短路徑依次經過的點
分析:路徑回溯,輕鬆解決,但是注意inf的值,需要盡量開大一點
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
inline
intread()
while
(ch>=
'0'&&ch<=
'9') s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}const
int maxn =
2e5+5;
struct edgeedge[maxn<<2]
;int n,m;
int head[maxn]
,tot;
ll dis[maxn]
;ll inf=
1e17+5
;bool vis[maxn]
;struct node};
void
add_edge
(int u,
int v,ll w)
int ans[maxn]
,cnt=0;
int pre[maxn]
;void
dijskra
(int s));
while
(!q.
empty()
)),pre[y]
=x;}}}
}int
main()
dijskra(1
);if(dis[n]
==inf)
puts
("-1");
else
for(
int i=cnt;i>=
2;i--
)printf
("%d "
,ans[i]);
printf
("\n");
}return0;
}
spfa求最短路
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸...
Dijkstra求最短路
題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1...
Dijkstra求最短路
題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示...