(前向星删边)南华大学第十五届ACM程序设计竞赛(E 免费机票)

(此处有前向星删边操作)先提供每删一条免费机票的边就跑一遍迪杰斯特拉,不过由于每次都跑一遍,复杂度较大需要堆优化。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const double pi = acos(-1);
const int maxn = 1200;
const ll mod = 1e9 + 7;
int n, s, t, k, q, cnt;
int head[maxn], vis[maxn], dis[maxn];
struct node{
    int to;
    int quan;
    int next;
}edge[maxn * maxn << 4];
struct nod{
    int u;
    int d;
    bool operator<(const nod& xgd) const{
        return d > xgd.d;
    }
};
priority_queue<nod> que;
void add(int u, int v, int w){
    edge[++cnt].to = v;
    edge[cnt].quan = w;
    edge[cnt].next = head[u];
    head[u] = cnt;
}

int dijiskra(int s, int t){
    memset(dis, INF, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    que.push(nod{s, 0});
    dis[s] = 0;
    while(!que.empty()){
        nod cur = que.top();
        que.pop();
        int k = cur.u;
        if(vis[k]) continue;
        vis[k] = 1;
        for(int i = head[k] ; i != -1 ; i = edge[i].next){
            int tt = edge[i].to;
            if(!vis[tt] && dis[tt] > dis[k] + edge[i].quan){
                dis[tt] = dis[k] + edge[i].quan;
                que.push(nod{tt, dis[tt]});
            }
        }
    }
    return dis[t];
}
int main()
{
    memset(head, -1, sizeof(head));
    int u, v, w;
    scanf("%d %d %d", &n, &s, &t);
    scanf("%d", &k);
    for(int i = 1 ; i <= k ; ++ i){
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w); add(v, u, w);
    }
    int ans = dijiskra(s, t);
    int anss = INF;
    scanf("%d", &q);
    for(int i = 1 ; i <= q ; ++ i){
        scanf("%d %d", &u, &v);
        add(u, v, 0); add(v, u, 0);
        anss = min(anss, dijiskra(s, t));
        head[v] = edge[cnt].next; cnt --;
        head[u] = edge[cnt].next; cnt --;
    }
    if(ans > anss) cout << "Yes" << endl;
    else cout << "No" << endl;
    cout << anss;
    return 0;
}

直接正向反向跑一遍迪杰斯特拉,dis代表正向跑, diss代表反向跑,最后最短的距离一定是min(dis[u]+diss[v],dis[v]+diss[u], dis[t]).

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const double pi = acos(-1);
const int maxn = 1200;
const ll mod = 1e9 + 7;
int n, s, t, k, q, cnt;
int head[maxn], vis[maxn], dis[maxn];
struct node{
    int to;
    int quan;
    int next;
}edge[maxn * maxn << 4];
struct nod{
    int u;
    int d;
    bool operator<(const nod& xgd) const{
        return d > xgd.d;
    }
};
priority_queue<nod> que;
void add(int u, int v, int w){
    edge[cnt].to = v;
    edge[cnt].quan = w;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}

int dijiskra(int s, int t){
    memset(dis, INF, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    que.push(nod{s, 0});
    dis[s] = 0;
    while(!que.empty()){
        nod cur = que.top();
        que.pop();
        int k = cur.u;
        if(vis[k]) continue;
        vis[k] = 1;
        for(int i = head[k] ; i != -1 ; i = edge[i].next){
            int tt = edge[i].to;
            if(!vis[tt] && dis[tt] > dis[k] + edge[i].quan){
                dis[tt] = dis[k] + edge[i].quan;
                que.push(nod{tt, dis[tt]});
            }
        }
    }
    return dis[t];
}
int main()
{
    memset(head, -1, sizeof(head));
    int u, v, w;
    scanf("%d %d %d", &n, &s, &t);
    scanf("%d", &k);
    for(int i = 1 ; i <= k ; ++ i){
        scanf("%d %d %d", &u, &v, &w);
        add(u, v, w); add(v, u, w);
    }
    int ans = dijiskra(s, t);
    int anss = INF;
    scanf("%d", &q);
    for(int i = 1 ; i <= q ; ++ i){
        scanf("%d %d", &u, &v);
        add(u, v, 0); add(v, u, 0);
        anss = min(anss, dijiskra(s, t));
        head[v] = edge[--cnt].next;
        head[u] = edge[--cnt].next;
    }
    if(ans > anss) cout << "Yes" << endl;
    else cout << "No" << endl;
    cout << anss;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zufesatoshi/article/details/89425389