Description
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
Hint
四种算法练手:
//Dijkstra
#include
#include
#include
#include
using namespace std;
#define N 1005
#define T 2005
#define INF 0x3f3f3f3f
int t,n;
int vis[N];
int g[N][N];
int d[N];
int dijkstra(int u){
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
d[u]=0;
for (int i=0;id[k]+g[k][j])
d[j]=d[k]+g[k][j];
}
return d[1];
}
int main(){
while (~scanf("%d%d",&t,&n)){
memset(g,0x3f,sizeof(g));
for (int i=0;id)
g[u][v]=g[v][u]=d;
}
printf("%d\n",dijkstra(n));
}
return 0;
}
//priority_queue dijkstra
#include
#include
#include
#include
#include
using namespace std;
#define N 1005
#define T 2005
#define INF 0x3f3f3f3f
int t,n;
int g[N][N];
int d[N];
struct dnode{
int u,d;
dnode(){}
dnode(int uu,int dd):u(uu),d(dd){}
bool operator < (const dnode &a) const{
return d==a.d?u>a.u:d>a.d;
}
};
int dijkstra(int u){
priority_queue q;
memset(d,0x3f,sizeof(d));
d[u]=0;
q.push(dnode(u,d[u]));
while (!q.empty()){
dnode cur=q.top(); q.pop();
for (int i=1;i<=n;i++){
if (d[i]>cur.d+g[cur.u][i]){
d[i]=cur.d+g[cur.u][i];
q.push(dnode(i,d[i]));
}
}
}
return d[1];
}
int main(){
while (~scanf("%d%d",&t,&n)){
memset(g,0x3f,sizeof(g));
for (int i=0;id)
g[u][v]=g[v][u]=d;
}
printf("%d\n",dijkstra(n));
}
return 0;
}
//bellman_ford
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 1005
#define T 2005
#define INF 0x3f3f3f3f
int g[N][N];
struct Edge{
int u,v,d;
Edge(int uu,int vv,int dd):u(uu),v(vv),d(dd){}
};
vector edge;
int t,n;
int u,v,l;
int d[N];
bool ford(int u){
memset(d,0x3f,sizeof(d));
d[u]=0;
for (int i=1;id[u]+l){
d[v]=d[u]+l;
flag=true;
}
}
if (!flag)
return true;
}
for (int j=1;jd[edge[j].u]+edge[j].d)
return false;
return true;
}
int main(){
while (~scanf("%d%d",&t,&n)){
memset(g,0x3f,sizeof(g));
for (int i=0;il)
g[u][v]=g[v][u]=l;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (g[i][j]!=INF)
edge.push_back(Edge(i,j,g[i][j]));
if (ford(n)){
printf("%d\n",d[1]);
}
}
return 0;
}
//SPFA
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 1005
#define T 2005
#define INF 0x3f3f3f3f
int g[N][N];
int t,n;
int u,v,l;
int d[N],vis[N];
int cnt[N];
int SPFA(int u){
queue q;
memset(d,INF,sizeof(d));
memset(vis,0,sizeof(vis));
q.push(u); vis[u]=1; d[u]=0;
while (!q.empty()){
u=q.front(); q.pop();
vis[u]=0;
for (int v=1;v<=n;v++){
if (d[u]+g[u][v] < d[v]){
d[v]=d[u]+g[u][v];
if (!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
return 1;
}
int main(){
while (~scanf("%d%d",&t,&n)){
memset(g,0x3f,sizeof(g));
for (int i=0;il)
g[u][v]=g[v][u]=l;
}
if (SPFA(n)){
printf("%d\n",d[1]);
}
}
return 0;
}