2020CSUST最短路练习

题目戳我

  1. Til the Cows Come Home
    板子题,不多说直接上代码
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
//#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define lson num<<1
#define rson num<<1|1
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 1e4+ 50;
const double esp = 1e-6;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const ll mod = 23333;
const  double pi=3.141592653589;
int  vis[maxn], first[maxn], len = 0;
int a[maxn];
int dis[maxn];
int n, m;
struct node
{
	int to, next, val;//t代表时间,c代表承重
}e[maxn << 1];

void add(int u, int v, int w)
{
	e[len].to = v;
	e[len].next = first[u];
	e[len].val = w;
	first[u] = len++;
}
struct point
{
	int  val, id;
	point(int id, int val)
	{
		this->id = id;
		this->val = val;
	}
	bool operator<(const point& x)const
	{
		return val > x.val;
	}
};
void dij(int s)
{
	ms(vis, 0);
	for (int i = 0; i <= m; i++) dis[i] = inf;
	priority_queue<point>q;
	q.push(point(s, 0));
	dis[s] = 0;
	while (!q.empty())
	{
		int rt = q.top().id;
		q.pop();
		if (vis[rt]) continue;
		vis[rt] = 1;
		for (int i = first[rt]; i != -1; i = e[i].next)
		{
			int id = e[i].to;
			if (!vis[id] && dis[rt] + e[i].val < dis[id])
			{
				dis[id] = dis[rt] + e[i].val;
				//cout<<dis[id][count1]<<endl;
				q.push(point(id, dis[id]));
			}
		}

	}
}
int main()
{
    ms(first,-1);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    dij(1);
    printf("%d\n",dis[m]);
    return 0;
}
  1. Frogger
    题意就是小青蛙从1到2的最短距离,这一题感觉用dijstra有点麻烦,直接flord(忘了到底是啥名字了)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 2e5 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int n;
struct node
{
    int x,y;
}a[205];
double dp[205][205];
int main()
{
    int  cas=1;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<i;j++)
            {
                dp[i][j]=dp[j][i]=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+(1.0*a[i].y-a[j].y)*(a[i].y-a[j].y));
               // printf("%d %d %lf \n",i,j,dp[i][j]);
            }
        }
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    dp[i][j]=min(dp[i][j],max(dp[i][k],dp[k][j]));
                }
            }
        }
        printf("Scenario #%d\n",cas++);
        printf("Frog Distance = %.3f\n\n",dp[1][2]);
    }
    return 0;
}

3.Heavy Transportation
每条边有一个最大承重,求从1到n最的路径中可以运输的最大重量
,怎么想呢?先初始化dis[i]=0(因为dis【i】这里代表的是从1到i的最大可以承重也就是这一条由1到i的最所有边里最小承重),然后按照原来的方法去求,只不过判断条件变了一下。

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 1e6 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int  vis[1050], first[1050], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int dis[1050];
int n, m;
struct node
{
	int to, next, val;
}e[maxn << 1];

void add(int u, int v, int w)
{
	e[len].to = v;
	e[len].next = first[u];
	e[len].val = w;
	first[u] = len++;
}
struct point
{
	int  val, id;
	point(int id, int val)
	{
		this->id = id;
		this->val = val;
	}
	bool operator<(const point& x)const
	{
		return val < x.val;
	}
};
void dij(int s)
{
	ms(vis, 0);
	for (int i = 0; i <= n; i++) dis[i] = 0;
	dis[s]=inf;
	priority_queue<point>q;
	q.push(point(s,dis[s]));
	while (!q.empty())
	{
		int rt = q.top().id;
		q.pop();
		if (vis[rt]) continue;
		vis[rt] = 1;
		for (int i = first[rt]; i != -1; i = e[i].next)
		{
			int id = e[i].to;
			if (!vis[id] && dis[id]<min(dis[rt],e[i].val))
			{
				dis[id] = min(dis[rt],e[i].val);
				//cout<<dis[id][count1]<<endl;
				q.push(point(id, dis[id]));
			}
		}

	}
}
int main()
{
    int t;
    scanf("%d",&t);
    int cas=1;
    while(t--)
    {
        len=0;
        ms(first,-1);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        dij(1);
        printf("Scenario #%d:\n",cas++);
        printf("%d\n\n",dis[n]);
    }
    return 0;
}

4.Silver Cow Party
这里是n个点每个点到s点的距离再加上从s点到各个点的距离其中所有可能的最大值,我的方法是先求s点到各个点的距离,再求1到n个点到s点的距离(n次dij)得到,因为数据小水过了,都是有一个更高效的方法,正着建一次跑一次从s到各个点的距离,反正建一次跑s到各个点的距离(其实就是从各个点到s点的距离)

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 1e6 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int  vis[1050], first[1050], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int dis[1050],sum[1005];
int n, m, x;
struct node
{
	int to, next, val;
}e[maxn << 1];

void add(int u, int v, int w)
{
	e[len].to = v;
	e[len].next = first[u];
	e[len].val = w;
	first[u] = len++;
}
struct point
{
	int  val, id;
	point(int id, int val)
	{
		this->id = id;
		this->val = val;
	}
	bool operator<(const point& x)const
	{
		return val > x.val;
	}
};
void dij(int s)
{
    for(int i=0;i<=n;i++)
    {
        vis[i]=0;
        dis[i]=inf;
    }
    priority_queue<point>q;
    dis[s]=0;
    q.push(point{s,0});
    while(!q.empty())
    {
        int rt=q.top().id;
        q.pop();
        if(vis[rt])continue;
        vis[rt]=1;
        for(int i=first[rt];~i;i=e[i].next)
        {
            int id=e[i].to;
            if(!vis[id]&&dis[rt]+e[i].val<dis[id])
            {
                dis[id]=dis[rt]+e[i].val;
                q.push(point{id,dis[id]});
            }
        }
    }
}
int main()
{
    ms(first,-1);
    len=0;
    scanf("%d%d%d",&n,&m,&x);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    dij(x);
    for(int i=1;i<=n;i++)
    {
        sum[i]=dis[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        dij(i);
        ans=max(ans,dis[x]+sum[i]);
    }
    printf("%d\n",ans);
    return 0;
}
  1. Currency Exchange
    spfa判断,如果循环中出现了起始货币小于在换的货币就代表可以;
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e4 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
//int  vis[maxn], first[maxn], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
double rate[105][105],com[105][105];
int n,m,s;
double v;
double dis[105];
bool spfa(int s)
{
    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        dis[i]=0;
      //  vis[i]=0;
    }
    q.push(s);
    dis[s]=v;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=1;i<=n;i++)
        {
            if(dis[i]<(dis[u]-com[u][i])*rate[u][i])
            {
                dis[i]=(dis[u]-com[u][i])*rate[u][i];
                if(dis[s]>v)
                {
                    return 1;
                }
                q.push(i);
            }
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d%d%lf",&n,&m,&s,&v);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        double x,y,z,w;
        scanf("%d%d%lf%lf%lf%lf",&u,&v,&x,&y,&z,&w);
        rate[u][v]=x,rate[v][u]=z;
        com[u][v]=y,com[v][u]=w;
    }
    if(spfa(s))
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}
  1. Wormholes
    这个题目我感觉十分的神奇,在传送虫洞可以减少时间,走路是正的时间问的是是否可以看见以前的自己,也就是说回到过去自己当时所在地,则只要出现了负环就可以看见。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e4 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int  vis[maxn], first[maxn], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int a[maxn];
int dis[maxn];
int n, m , w;
struct node
{
	int to, next, val;//t代表时间,c代表承重
}e[maxm << 3];

void add(int u, int v, int w)
{
	e[len].to = v;
	e[len].next = first[u];
	e[len].val = w;
	first[u] = len++;
}
bool spfa(int s)
{
    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
        vis[i]=0;
    }
    q.push(s);
    dis[1]=0;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        if(++vis[u]>=n)return 1;
        for(int i=first[u];~i;i=e[i].next)
        {
            int  v=e[i].to;
            if(dis[v]>dis[u]+e[i].val)
            {
                dis[v]=dis[u]+e[i].val;
                q.push(v);
            }
        }
    }
    return 0;
}
int main()
{

    int T;
    scanf("%d",&T);
    while(T--)
    {
        ms(first,-1);
        len=0;
        scanf("%d%d%d",&n,&m,&w);
        for(int i=1; i<=m; i++)
        {
           int u,v,x;
           scanf("%d%d%d",&u,&v,&x);
           add(u,v,x);
           add(v,u,x);
        }
        for(int i=1;i<=w;i++)
        {
            int u,v,x;
            scanf("%d%d%d",&u,&v,&x);
            add(u,v,-x);
        }
        if(spfa(1))
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}
  1. MPI Maelstrom
    读题半小时,写代码五分钟,读完题目发现就是求1到到其他点的最短路中的最大值
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int a[105][105],dis[105],vis[105],n;
struct node
{
    int id,val;
    node(int id,int val)
    {
        this->id=id;
        this->val=val;
    }
    bool operator<(const node &x)const
    {
        return val>x.val;
    }
};
void dij(int s)
{
    ms(vis,0);
    for(int i=0;i<=n;i++)
    {
        dis[i]=inf;
    }
    dis[s]=0;
    priority_queue<node>q;
    q.push(node(s,0));
    while(!q.empty())
    {
        int u=q.top().id;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=1;i<=n;i++)
        {
            if(dis[i]>dis[u]+a[u][i])
            {
                dis[i]=dis[u]+a[u][i];
                q.push(node(i,dis[i]));
            }
        }
    }
}
int get(char x[])
{
    int ans=0;
    int len=strlen(x);
    for(int i=0;i<len;i++)
    {
        ans=(ans*10+x[i]-'0');
    }
    return ans;
}
int main()
{
   // int n;
    scanf("%d",&n);
    char ch[10];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {

            scanf("%s",ch);
            if(ch[0]!='x')
                a[i][j]=a[j][i]=get(ch);
            else
                a[i][j]=a[j][i]=inf;
        }
    }
    dij(1);
    int ans=-inf;
    for(int i=2;i<=n;i++)
    {
        ans=max(ans,dis[i]);
    }
    printf("%d\n",ans);
    return 0;
}
  1. Cow Contest
    这题的意思就是求能确定关系的个数,也就是其他点和这个点是否存在路径
    暴力跑一下floyd就好了
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int n,m;
int dis[105][105];
void floyd()
{
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}
int main()
{

    scanf("%d%d",&n,&m);
    for (int i = 1; i <=n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            dis[i][j] = i == j ? 0 : inf;
        }
    }
    for(int i=1; i<=m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        dis[u][v]=1;
    }
    int ans=0;
    floyd();
    for(int i=1; i<=n; i++)
    {
        bool flage=true;
        for(int j=1; j<=n; j++)
        {
            if(dis[i][j]==inf&&dis[j][i]==inf)
            {
                flage=false;
            }
        }
        if(flage)
        {
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}
  1. Arbitrage
    和前面那个题差不多
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
map<string,int>mp;
int cnt,n,m;
double a[35][35];
double dis[35];
bool spfa(int s)
{
    queue<int>q;
    q.push(s);
    for(int i=1;i<=n;i++)
    {
        dis[i]=0;
    }
    dis[s]=100;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=1;i<=n;i++)
        {
            if(dis[i]<dis[u]*a[u][i])
            {
                dis[i]=dis[u]*a[u][i];
                if(dis[s]>100)
                {
                    return 1;
                }
                q.push(i);
            }
        }
    }
    return 0;
}
int main()
{
    IOS;
    int cas=1;
    while(cin>>n)
    {
        if(n==0)
        {
            break;
        }
        mp.clear();
        ms(a,0);
        cnt=0;
        string s,s2;
        for(int i=1;i<=n;i++)
        {
           cin>>s;
           mp[s]=++cnt;
        }
        cin>>m;
        double x;
        for(int i=1;i<=m;i++)
        {
            cin>>s>>x>>s2;
            a[mp[s]][mp[s2]]=x;
        }
        if(spfa(1))
        {
           cout<<"Case "<<cas++<<": Yes"<<endl;
        }
        else
        {
            cout<<"Case "<<cas++<<": No"<<endl;
        }
    }
    return 0;
}

正反建图然后把所有的dis【i】加起来

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 1e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int first1[maxn],cnt1,cnt2,first2[maxn],n,vis[maxn];
int m;
ll dis[maxn];
struct node
{
    int to,next,val;
}g1[maxn],g2[maxn];
void add(int u,int v,int w)
{
    g1[++cnt1].to=v;
    g1[cnt1].next=first1[u];
    g1[cnt1].val=w;
    first1[u]=cnt1;
    g2[++cnt2].to=u;
    g2[cnt2].next=first2[v];
    g2[cnt2].val=w;
    first2[v]=cnt2;
}
struct point
{
    int id,val;
    point(int id,int val)
    {
        this->id=id;
        this->val=val;
    }
    bool operator<(const point&x)const
    {
        return val>x.val;
    }
};
void dij(int s)
{
    for(int i=0;i<=n;i++)
    {
        vis[i]=0;
        dis[i]=inf;
    }
    priority_queue<point>q;
    dis[s]=0;
    q.push({s,0});
    while(!q.empty())
    {
        int u=q.top().id;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=first1[u];~i;i=g1[i].next)
        {
            int v=g1[i].to;
            if(dis[v]>dis[u]+g1[i].val&&!vis[v])
            {
                dis[v]=dis[u]+g1[i].val;
                q.push(point(g1[i].to,dis[v]));
            }
        }
    }
}
void dij2(int s)
{
    for(int i=0;i<=n;i++)
    {
        vis[i]=0;
        dis[i]=inf;
    }
    priority_queue<point>q;
    dis[s]=0;
    q.push({s,0});
    while(!q.empty())
    {
        int u=q.top().id;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=first2[u];~i;i=g2[i].next)
        {
            int v=g2[i].to;
            if(dis[v]>dis[u]+g2[i].val&&!vis[v])
            {
                dis[v]=dis[u]+g2[i].val;
                q.push(point(g2[i].to,dis[v]));
            }
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            first1[i]=-1;
            first2[i]=-1;
        }
        cnt1=0;
        cnt2=0;
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        ll ans=0;
        dij(1);
        for(int i=2;i<=n;i++)
        {
            ans+=dis[i];
        }
        dij2(1);
        for(int i=2;i<=n;i++)
        {
            ans+=dis[i];
        }
        printf("%lld\n",ans);
    }
    return 0;
}

看懂题目后也是水题,板子题

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int n,m;
int head[maxn],dis[maxn],len,vis[maxn];
struct node
{
    int to,next,val;
}e[maxn<<1];
struct point
{
    int id,val;
    point(int id,int val)
    {
        this->id=id;
        this->val=val;
    }
    bool operator<(const point& x)const
	{
		return val > x.val;
	}
};
void add(int u,int v,int w)
{
    e[len].to=v;
    e[len].next=head[u];
    e[len].val=w;
    head[u]=len++;
}
void dij(int s)
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
        vis[i]=0;
    }
    priority_queue<point>q;
    dis[s]=0;
    q.push(point(s,0));
    while(!q.empty())
    {
        int u=q.top().id;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u];~i;i=e[i].next)
        {
            int v=e[i].to;
            if(dis[v]>dis[u]+e[i].val&&!vis[v])
            {
                dis[v]=dis[u]+e[i].val;
                q.push(point(v,dis[v]));
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        ms(head,-1);
        len=0;
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        dij(1);
        printf("%d\n",dis[n]);
    }
    return 0;
}


疯狂建边

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 5e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll  lnf  = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const  double pi=3.141592653589;
int subx[205],suby[205];
double mp[205][205];
int cnt=2,temp=2,vis[205];
double dis[205];
struct point
{
    int id;
    double val;
    point(int id,double val)
    {
        this->id=id;
        this->val=val;
    }
    bool operator<(const point & x)const
    {
        return val>x.val;
    }
};
void dij(int s)
{
    for(int i=0;i<=cnt;i++)
    {
        dis[i]=(double)inf;
        vis[i]=0;
    }
    dis[s]=0;
    priority_queue<point>q;
    q.push(point(s,0.0));
    while(!q.empty())
    {
        int u=q.top().id;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=0;i<cnt;i++)
        {
            if(dis[i]>dis[u]+mp[u][i])
            {
                dis[i]=dis[u]+mp[u][i];
                q.push(point(i,dis[i]));
            }
        }
    }
}
int sove(int x1,int x2,int y1,int y2)
{
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
    scanf("%d%d%d%d",&subx[0],&suby[0],&subx[1],&suby[1]);
    int x,y;
    while(scanf("%d%d",&x,&y)!=EOF)
    {

        if(x==-1&&y==-1)
        {
            for(int i=cnt;i<temp-1;i++)
            {
                mp[i][i+1]=mp[i+1][i]=sqrt(1.0*sove(subx[i],subx[i+1],suby[i],suby[i+1]))*3.0/2000.0;
            }
            cnt=temp;
            continue;
        }
        subx[temp]=x;
        suby[temp++]=y;
    }
   // bug;
    for(int i=0;i<cnt;i++)
    {
        for(int j=i+1;j<cnt;j++)
        {
            if(mp[i][j]==0)
            mp[i][j]=mp[j][i]=sqrt(1.0*sove(subx[i],subx[j],suby[i],suby[j]))*3.0/500;
        }
    }
    dij(0);
    printf("%d\n",(int)(dis[1]+0.5));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qcccc_/article/details/107476298
今日推荐