cug1697 spfa+邻接表

题目大意:赤壁决战,曹操在有利形势下,轻敌自负,指挥失误,终致战败。孙权、刘备在强敌进逼关头,结盟抗战,扬水战之长,巧用火攻,终以弱胜强。赤壁之战结束之后魏蜀吴三国决定握手求和,但是因为之前四处交战,把道路全部毁坏了,现在需要重新修路使得三国的国都能够连通.诸葛亮是这个项目的负责人,但是他太聪明了,对于这种题目都懒得思考了,于是就交给你了。

思路:因为要求三个和城市之间的最短路,最短路一定是经过某一点到三点距离和最小,不是一个城市到其他两个城市的最短路。所以3遍spfa把三个城市的最短路跑出来,然后枚举中间点即可。

无法连通输出-1;

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 200005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
typedef pair<int , int> pii;
const long long INF= 0x3fffffff;
int n , m;
struct Edge
{
    int u , v , w , next;
}edge[maxn];
int head[maxn] , id;
int cost1[maxn] , cost2[maxn] , cost3[maxn];

void addedge(int u , int v , int w)
{
    edge[id].u = u;
    edge[id].v = v;
    edge[id].w = w;
    edge[id].next = head[u];
    head[u] = id ++;
}

void spfa(int root , int cost[])
{
    for(int i = 0 ; i <= n ; i ++) cost[i] = 90000000;
    cost[root] = 0;
    queue<int>q;
    q.push(root);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(int i = head[u] ; i != -1 ; i = edge[i].next)
        {
            if(cost[edge[i].v] > cost[u] + edge[i].w)
            {
                q.push(edge[i].v);
                cost[edge[i].v] = cost[u] + edge[i].w;
            }
        }
    }
}

int main()
{
    int t;
    scanf("%d" , &t);
    while(t--)
    {
        mem(head , -1);
        id = 0;
        scanf("%d %d" , &n , &m);
        int u ,v , w;
        for(int i = 0 ; i < m ; i ++)
        {
            scanf("%d %d %d" , &u , &v , &w);
            addedge(u , v , w);
            addedge(v , u , w);
        }
        int a , b , c;
        scanf("%d %d %d" , &a , &b , &c);
        spfa(a , cost1);
        spfa(b , cost2);
        spfa(c , cost3);
        long long ans = INF;
        for(int i = 1 ; i <= n ; i ++)
        {
            ans = min(ans , (LL)cost1[i] + cost2[i] + cost3[i]);
        }
        if(cost1[b] == cost1[c] && cost1[b] == 90000000 || cost2[a] == cost1[c] && cost2[a] == 90000000 || cost3[b] == cost3[a] && cost3[b] == 90000000)
        {
            printf("-1\n");
        }
        else cout << ans << endl;
    }
    return 0;
}
时间: 2024-10-15 08:57:42

cug1697 spfa+邻接表的相关文章

POJ--3268--Silver Cow Party【SPFA+邻接表】

题意:一些牛要去某一点参加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少需要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其他各个点的最短路径.从牛的家中走到聚会地点,可以把路径反过来变成从聚会地点到各个点的最短路径,两个最短路径值加起来就是每头牛所花费的最小时间,找出最大的即可. 我用了两个邻接表存路径,其实这道题用邻接矩阵存更好做,矩阵横纵坐标翻转就把路径反转了,我用SPFA写想练练手,一直都不会手写SPFA,做几道题找找感觉. AC居然用时0MS.. #inclu

HDU 2544 最短路 SPFA 邻接表 模板

Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想要寻找最短的从商店到赛场的路线,你能够帮助他们吗? Input 输入包含多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行

poj1511——Invitation Cards(SPFA+邻接表)

Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitation cards with all

SPFA&amp;邻接表 PASCAL

题目来自CODE[VS]-->热浪 1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 题目描述 Description 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦. FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线.

poj 1511 Invitation Cards (spfa+邻接表)

Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 19527   Accepted: 6375 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan

POJ 3259 Wormholes(SPFA+邻接表)

( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<queue> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int INF=10e7; const int MAXN=510; int f,n,m,w,s,e,t; int lc[MAXN],cntNode

POJ 1511 SPFA+邻接表

#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xffffffff #define maxn 1000005 struct Edge { int w, e; }; int UseCount[m

uva 11374 Airport Express(spfa 邻接表+队列)

Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more quickly than other transports. There are two types of trains in Airport-Express, the Economy-Xpress and theCommercial-Xpress

ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))

求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一: 1 //POJ1511-ZOJ2008 2 //Time:7766Ms Memory:99112K 3 //求从1处到各点后再返回1处的最短总路长 4 //需要构造邻接表和逆邻接表 5 //构造方法1:vector构造邻接表 6 //SPFA+邻接表 7 #include<iostream>