您的位置:首页 > 其它

hdu 2680 Choose the best route(spfa/dijkstra)

2016-08-29 21:53 274 查看

题意:

给你一张 有向图 然后让你求多个起点到一个终点的最短路径

坑点:从x到y可能有多条路。

思路:

有一个巧妙地办法:

把终点当成起点,构图时反向建图。

AC代码(spfa,280ms):

#include <iostream>
#include <string.h>
#include <vector>
#include <cstdio>
#include <queue>

using namespace std;

struct edge{
int y;
int v;
};

int dis[1100];
vector <edge> v[1100];
int vis[1100];//是否在队列中
int cnt[1100];

bool spfa(int b,int n){
queue<int> q;
q.push(b);
vis[b] = true;
dis[b] = 0;
while(!q.empty()){
int po = q.front();
q.pop();
vis[po] = false;
cnt[po]++;
if(cnt[po] >= n) return false;
for(int i = 0;i < v[po].size();i++){
if(dis[v[po][i].y] > dis[po] + v[po][i].v){
dis[v[po][i].y] = dis[po] + v[po][i].v;
if(vis[v[po][i].y] == false){
q.push(v[po][i].y);
vis[v[po][i].y] = true;
cnt[v[po][i].y]++;
if(cnt[v[po][i].y] >= n) return false;
}
}
}
}
return true;
}

int main()
{
int n,m,b;
while(~scanf("%d%d%d",&n,&m,&b)){
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
int x;
edge temp;
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&temp.y,&x,&temp.v);
v[x].push_back(temp);
}
spfa(b,n);
int ne,e;
scanf("%d",&ne);
int ans = 0x3f3f3f3f;
for(int i = 1;i <= ne;i++){
scanf("%d",&e);
ans = min(ans,dis[e]);
}

if(ans == 0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",ans);
for(int i = 1;i <= n;i++){
v[i].clear();
}
}
return 0;
}


AC代码(dijkstra 327ms):

#include <iostream>
#include <string.h>
#include <vector>
#include <cstdio>
#include <queue>

using namespace std;

struct edge{
int y;
int v;
bool operator < (const edge &b)const{
return v > b.v;
}
};

int dis[1100];
vector <edge> v[1100];
int vis[1100];//是否在松驰过
bool t[1100][1100];//是否有多条路

void dijkstra(int b){
priority_queue<edge> q;
dis[b] = 0;
edge temp;
temp.y = b;
temp.v = 0;
q.push(temp);
int po = q.top().y;
while(!q.empty()){
po = q.top().y;
q.pop();
for(int i = 0;vis[po] == false && i < v[po].size();i++){
if(dis[v[po][i].y] > dis[po] + v[po][i].v){
dis[v[po][i].y] = dis[po] + v[po][i].v;
temp.y = v[po][i].y;
temp.v = dis[v[po][i].y];
q.push(temp);
}
}
vis[po] = true;
}
}

int main()
{
int n,m,b;
while(~scanf("%d%d%d",&n,&m,&b)){
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,false,sizeof(vis));
memset(t,false,sizeof(t));
int x;
edge temp;
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&temp.y,&x,&temp.v);
v[x].push_back(temp);
if(t[x][temp.y] == false){
v[x].push_back(temp);
t[x][temp.y] = true;
}
else{
for(int i = 0;i < v[x].size();i++){
if(v[x][i].y == temp.y){
v[x][i].v = min(v[x][i].v,temp.v);
break;
}
}
}
}
dijkstra(b);
int ne,e;
scanf("%d",&ne);
int ans = 0x3f3f3f3f;
for(int i = 1;i <= ne;i++){
scanf("%d",&e);
ans = min(ans,dis[e]);
}
if(ans == 0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",ans);
for(int i = 1;i <= n;i++){
v[i].clear();

db77
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: