(不是妹子) 蒟蒻求问各位好心人,为啥用了set求最短路经过的点集就会错
查看原帖
(不是妹子) 蒟蒻求问各位好心人,为啥用了set求最短路经过的点集就会错
257348
theHermit楼主2020/9/22 16:28

#include<bits/stdc++.h>
#define For(i,m,n) for(register int i=m;i<n;i++)
#define rFor(i,m,n) for(register int i=m;i>n;i--)
#define r(a) read(a)
#define rr(a,b) read(a),read(b)
#define rrr(a,b,c) read(a),read(b),read(c)
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
template <class T>
inline void read(T &x)
{
	x=0;
    T f=1;
    char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	x=x*f;
}
const int MaxN = 200, MaxM = 40010;
//const i INF=1e20;
//const int INF=0x7fffffff;
const int INF=1e9;
const int MOD=100003;

int dist[MaxN][MaxN];
map<int,set<int> > mp;
bool IsExist[MaxN][MaxN];
int n,m;
int d;
void input()
{
    rr(n,m);
    For(i,1,n+1)    For(j,1,n+1)    if(i!=j)    dist[i][j]=INF;
    For(i,1,m+1){
        int u,v,w;rr(u,v);
        w=1;
        dist[u][v]=w;
        dist[v][u]=w;
        mp[u*100+v].insert(u);
        mp[u*100+v].insert(v);
        mp[v*100+u].insert(u);
        mp[v*100+u].insert(v);
    }
}

void Floyd()
{
    For(k,1,n+1){
        For(i,1,n+1){
            For(j,1,n+1){
                //可以用于负环
                int t=dist[i][k]+dist[k][j];
                if(dist[i][j]>=t){
                    dist[i][j]=t;
                    dist[j][i]=t;
                    if(dist[i][j]>t){
                        mp[i*100+j].clear();
                        mp[j*100+i].clear();
                    }
                    for(set<int>::iterator Iter=mp[i*100+k].begin();Iter!=mp[i*100+k].end();Iter++){
                        mp[i*100+j].insert(*Iter);
                        mp[j*100+i].insert(*Iter);
//                        cout<<*Iter<<' ';
                    }
                    for(set<int>::iterator Iter=mp[k*100+j].begin();Iter!=mp[k*100+j].end();Iter++){
                        mp[i*100+j].insert(*Iter);
                        mp[j*100+i].insert(*Iter);
//                        cout<<*Iter<<' ';
                    }
//                    cout<<'\n';
                }
            }
        }
    }
}

int main()
{
    input();
    Floyd();
    r(d);
    For(i,0,d){
        int x,y;rr(x,y);
        for(set<int>::iterator Iter=mp[x*100+y].begin();Iter!=mp[x*100+y].end();Iter++){
            cout<<*Iter<<' ';
        }
        cout<<'\n';
    }
    return 0;
}
2020/9/22 16:28
加载中...