最短路练习

 

目录


A - Til the Cows Come Home
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int inf=0x3f3f3f3f;
int g[3500][3500];
int dis[3500],vis[3500];
int main()
{
	int t,n;
	cin>>t>>n;
	int a,b,v;
	memset(g,inf,sizeof(g));
	for(int i=1;i<=t;i++)
	{
		cin>>a>>b>>v;
		g[a][b]=g[b][a]=min(g[a][b],v);
	}
	for(int i=1;i<=n;i++)
	{
		dis[i]=g[1][i];
		vis[i]=0;
	}
	dis[1]=0;
	vis[1]=1;
	for(int i=1;i<=n;i++)
	{
		int ans=inf,k=0;
		for(int j=1;j<=n;j++)
		{
			if(dis[j]<ans&&!vis[j])
			{
				ans=dis[j];
				k=j;
			}
		}
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&dis[j]>dis[k]+g[k][j])
			{
				dis[j]=dis[k]+g[k][j];
			}
		}
	}
	cout<<dis[n]<<endl;
}
 B - Frogger

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define inf 0x3f3f3f3f;
using namespace std;
double g[3500][3500];
double dis[3500];
int vis[3500];
struct st{
	double x,y;
}s[250];
int main()
{
	int t,n;t=1;
    while(scanf("%d",&n)!=EOF&&n)
    {
	    for(int i=1;i<=n;i++)
	    {
	    	cin>>s[i].x>>s[i].y;
	    	for(int j=1;j<i;j++)
	    	{
	    		double a=s[i].x-s[j].x;
	    		double b=s[i].y-s[j].y;
	    		double v=sqrt(a*a+b*b);
	    	  //  cout<<a<<" "<<b<<" "<<v<<endl;
				g[i][j]=g[j][i]=v;
			
			}
		}
		/*for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cout<<i<<" "<<j<<" "<<g[i][j]<<endl;
			}
		}*/
	    for(int i=1;i<=n;i++)
	   {
		dis[i]=g[1][i];
		vis[i]=0;
	   }
	for(int i=1;i<=n;i++)
	{
		double ans=inf;
		int k=-1;
		for(int j=1;j<=n;j++)
		{
			if(dis[j]<ans&&!vis[j])
			{
				ans=dis[j];
				k=j;
			}
		}
		if(k!=-1){
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&dis[j]>max(dis[k],g[k][j]))
			{
				dis[j]=max(dis[k],g[k][j]);
			}
		}
	}}
	printf("Scenario #%d\nFrog Distance = %.3lf\n\n",t++,dis[2]);
	
}}
 C - Heavy Transportation
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll g[1500][1500];
ll dis[1500];
int vis[1500];
int main()
{
	int t,n,m;
	cin>>t;
	int e=1;
    while(t--)
    {
    	cin>>n>>m;
    	ll a,b,v;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(i==j) g[i][j]=0;
    			else g[i][j]=-1;
			}
		}
	    for(int i=1;i<=m;i++)
	    {
	    	cin>>a>>b>>v;
	    	g[a][b]=g[b][a]=v;
		}
	    for(int i=1;i<=n;i++)
	   {
		dis[i]=g[1][i];
		vis[i]=0;
	   }
	   dis[1]=0;
	   vis[1]=1;
	for(int i=1;i<=n;i++)
	{
		int ans=0;
		int k=-1;
		for(int j=1;j<=n;j++)
		{
			if(dis[j]>ans&&!vis[j])
			{
				ans=dis[j];
				k=j;
			}
		}
		//cout<<k<<endl;
		if(k!=-1){
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&dis[j]<min(dis[k],g[k][j]))
			{
				dis[j]=min(dis[k],g[k][j]);
			}
		}
	}}
	cout<<"Scenario #"<<e<<":"<<endl;
	cout<<dis[n]<<endl<<endl;
	e++;
	
}}
D - Silver Cow Party
#include<bits/stdc++.h>
#define inf 0x7fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
struct edg{
	int to;
	int vi,wi;
}e[100005];
int cnt,head[100005];
void add(int a,int b,int c)
{
	e[++cnt].to=head[a];
	e[cnt].vi=b;
	e[cnt].wi=c;
	head[a]=cnt;
}
int dis[100005],vis[100005],vis1[100005],dis1[100005];
struct ed{
	int v,w;
	bool operator<(const ed&c)const
	{
		return c.w<w;
	}
};
priority_queue<ed>q;
int main()
{
  ll n,m,x;
  n=read();
  m=read();
  x=read();
  int a,b,t;
  for(int i=0;i<m;i++)
  {
  	a=read();
  	b=read();
  	t=read();
  	add(a,b,t);
  }
  memset(vis,0,sizeof(vis));
  memset(dis,0x3f,sizeof(dis));
  q.push(ed{x,0});
  vis[x]=1;
  dis[x]=0;
  while(!q.empty())
  {
  	ed d=q.top();
  	q.pop();
  	vis[d.v]=0;
  	int a1=d.v,b1=d.w;
  	for(int i=head[a1];i;i=e[i].to)
  	{
  		int j=e[i].vi;
  		if(dis[j]>dis[a1]+e[i].wi)
  		{
  			dis[j]=dis[a1]+e[i].wi;
  			if(!vis[j])
  			{
  				vis[j]=1;
  				q.push(ed{j,dis[j]});
			}
		}
	}
  }
  int ans=0,su=0;
  for(int i=1;i<=n;i++)
  {
  	if(i!=x)
  	{
  		su=dis[i];
  		//cout<<dis[i]<<endl;
  		priority_queue<ed>p;
  		memset(vis1,0,sizeof(vis1));
  		memset(dis1,0x3f,sizeof(dis1));
  		p.push(ed{i,0});
  		dis1[i]=0;
  		vis1[i]=1;
  		while(!p.empty())
  		{
  			int l=p.top().v;
  			int y=p.top().w;
  			p.pop();
  			vis1[l]=0;
  			for(int i=head[l];i;i=e[i].to)
  			{
  				int k=e[i].vi;
  				if(dis1[k]>dis1[l]+e[i].wi)
  				{
  					dis1[k]=dis1[l]+e[i].wi;
  					if(!vis1[k])
  					{
  						vis1[k]=1;
  						p.push(ed{k,dis1[k]});
					  }
				  }
			  }
		}
		su+=dis1[x];
		if(su>ans) ans=su;
	}
  }
  cout<<ans<<endl;
}

F - Wormholes
#include<bits/stdc++.h>
#define inf 0x7fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
struct edg{
	int to;
	int vi,wi;
}e[100005];
int cnt,head[100005];
void add(int a,int b,int c)
{
	e[++cnt].to=head[a];
	e[cnt].vi=b;
	e[cnt].wi=c;
	head[a]=cnt;
}
int dis[100005],vis[100005],cn[100005],dis1[100005];
struct ed{
	int v,w;
	bool operator<(const ed&c)const
	{
		return c.w<w;
	}
};
priority_queue<ed>q;
int main()
{
  int t;
  t=read();
  while(t--)
  {
  	ll n,m,w;
  	n=read();
  	m=read();
  	w=read();
  	int u,v,p;
	  queue<int>q;	
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	memset(cn,0,sizeof(cn));
	memset(head,0,sizeof(head));
	cnt=0;
  	for(int i=1;i<=n;i++)
  	{
  		q.push(i);
  		vis[i]=1;
	}
  	for(int i=0;i<m;i++)
  	{
  		u=read();
  		v=read();
  		p=read();
  		add(u,v,p);
  		add(v,u,p);
	}
	for(int i=0;i<w;i++)
	{
		u=read();
		v=read();
		p=read();
		add(u,v,-p);
	}

	int fl=0;
	while(!q.empty())
	{
		int f=q.front();
		q.pop();
		vis[f]=0;
		for(int i=head[f];i;i=e[i].to)
		{
			int v=e[i].vi;
			if(dis[v]>dis[f]+e[i].wi)
			{
				dis[v]=dis[f]+e[i].wi;
				cn[v]=cn[f]+1;
				if(cn[v]>=n)
				{
					fl=1;
					break;
				}
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
			
		}if(fl) break;
	}
	if(fl) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	for(int i=0;i<=n;i++)
	{
		e[i].to=0;
		e[i].vi=0;
		e[i].wi=0;
	}
  }
}

G - MPI Maelstrom
//#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include<stdio.h>
#define inf 0x3fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
ll ma=1e18;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
struct ed{
	int v,w,to;
}e[100005];
int head[100005],vis[100005],dis[100005],cnt;
void add(int x,int y,int z)
{
	e[++cnt].to=head[x];
	e[cnt].v=y;
	e[cnt].w=z;
	head[x]=cnt;
}
struct qq{
	int b,c;
	bool operator<(const qq& zz)const
	{
		return c>zz.c;
	}
};
int t[10005][10005];
int main()
{
  int n;
  while(cin>>n){
  memset(vis,0,sizeof(vis));
  //memset(head,0,sizeof(head));
 // cnt=0;
 for(int i=1;i<=n;i++)
 {
 	for(int j=1;j<=i;j++)
 	{
 		if(j!=i) t[i][j]=t[j][i]=inf;
 		else t[i][j]=0;
	 }
 }
  
  for(int i=2;i<=n;i++)
  {
  	for(int j=1;j<i;j++)
  	{
	    char a[30];
  		scanf("%s",a);
  		if(a[0]!='x')
  		{
  			int l=atoi(a);
  			t[i][j]=t[j][i]=l;
		}
	  }
  }
  for(int i=1;i<=n;i++)
  dis[i]=t[1][i];
  dis[1]=0;
  vis[1]=1;
  int w=inf,k=0;
  for(int i=1;i<=n;i++)
  {
  	w=inf,k=0;
  	for(int j=1;j<=n;j++)
  	{
  		if(!vis[j]&&dis[j]<w)
  		{
  			w=dis[j];
  			k=j;
		  }
	  }
	  vis[k]=1;
	  for(int j=1;j<=n;j++)
	  {
	  	if(!vis[j]&&dis[j]>dis[k]+t[k][j])
	  	{
	  		dis[j]=dis[k]+t[k][j];
		  }
	  }
  }
  ll ans=0;
  for(int i=2;i<=n;i++)
  {
  	if(dis[i]>ans&&dis[i]!=inf)
  	ans=dis[i];
  //	cout<<dis[i]<<endl;
  }
  cout<<ans<<endl;
 
  }
}
H-Cow Contest
#include<bits/stdc++.h>
#define inf 0x7fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

/*struct edge{
	int vi,wi,nex;
}e[510];
struct node{
	int x,y;
	bool operator <(const node&a)const
	{
		return y>a.y;
	}
};
void add(int x,int y,int w)
{
	e[++cnt].nex=head[x];
	e[cnt].vi=y;
	e[cnt].wi=w;
	head[x]=cnt;
}
priority_queue<node>q;*/
int g[150][150];
int main()
{
	//int n,m;
	ll k;
	int n;
	n=read();
	//ans[0]=1;
	k=read();
	//map<ll,ll>p,q,r;
	ll x,y;
	for(int i=0;i<k;i++)
	{
		x=read();
		y=read();
		g[x][y]++;
	}
	//ll ans=1,a;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
			{
				if(g[j][i]&&g[i][k])
				{
					g[j][k]++;
				}
			}
		}
	}
	int f=0,ans=0;
	for(int i=1;i<=n;i++)
	{
		f=0;
		for(int j=1;j<=n;j++)
		{
			if(g[j][i]||g[i][j]||i==j)
			{
				continue;
			}
			else {
				f=1;
				break;
			}
		}
		if(!f) ans++;
	}
	cout<<ans<<endl;
	
}
I - Arbitrage
#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include<stdio.h>
#define inf 0x3fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
ll ma=1e18;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
   int n,k=1;
   while(1){
   n=read();
   if(n==0) break;
   string a,b;
   double g[50][50];
   for(int i=1;i<=n;i++)
   {
   	for(int j=1;j<=n;j++)
   	{
   		if(i==j) g[i][j]=1.0;
   		else g[i][j]=0;
	   }
   }
   map<string,int>p;
   for(int i=1;i<=n;i++)
   {
   	 cin>>a;
   	 p[a]=i;
   }
   int t;
   double c;
   t=read();
   for(int i=0;i<t;i++)
   {
   	 cin>>a>>c>>b;
   	 int l=p[a],m=p[b];
   	 g[l][m]=c;
   }
   cout<<"Case "<<k<<": ";
   k++;
   for(int i=1;i<=n;i++)
   {
   	for(int j=1;j<=n;j++)
   	{
   		for(int d=1;d<=n;d++)
   		{
   			if(g[j][d]<g[j][i]*g[i][d])
   			{
   				g[j][d]=g[j][i]*g[i][d];
			   }
		   }
	   }
   }
   int fl=0;
   for(int i=1;i<=n;i++)
   {
   	 if(g[i][i]>1)
   	 {
   	 	fl=1;
   	 	break;
		}
   }
   if(fl) cout<<"Yes"<<endl;
   else cout<<"No"<<endl;
}}
J - Invitation Cards
#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include<stdio.h>
#define inf 0x3fffffff
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
ll ma=1e18;
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
struct edg{
	ll to,v,w;
}e[1000005];
int cnt,head[1000005],cnt1,vis[1000005],t[1000005][3];
ll dis[1000005];
void add(ll x,ll y,ll z)
{
	e[++cnt].to=head[x];
	e[cnt].v=y;
	e[cnt].w=z;
	head[x]=cnt;
}
queue<int>o;
int main()
{
	int n;
	n=read();
	while(n--)
	{
		ll p,q;
		p=read();
		q=read();
		memset(head,0,sizeof(head));
		//memset(head1,0,sizeof(head1));
		cnt=0;
		memset(vis,0,sizeof(vis));
		memset(dis,0x3f,sizeof(dis));
		for(int i=0;i<q;i++)
		{
			t[i][0]=read();
			t[i][1]=read();
			t[i][2]=read();
			add(t[i][0],t[i][1],t[i][2]);
		//	add1(b,a,c);
		}
	//	queue<int>o,f;
		o.push(1);
		vis[1]=1;
		dis[1]=0;
		while(!o.empty())
		{
			int s=o.front();
			o.pop();
			vis[s]=0;
			for(int i=head[s];i;i=e[i].to)
			{
				int vi=e[i].v;
				if(dis[vi]>dis[s]+e[i].w)
				{
					dis[vi]=dis[s]+e[i].w;
					if(!vis[vi])
					{
						vis[vi]=1;
						o.push(vi);
					}
				}
			}
		}
		ll ans=0;
		for(int i=1;i<=p;i++)
		{
			ans+=dis[i];
			dis[i]=inf;
		}
		memset(head,0,sizeof(head));
		//memset(head1,0,sizeof(head1));
		cnt=0;
		memset(vis,0,sizeof(vis));
		memset(e,0,sizeof(e));
		for(int i=0;i<q;i++)
		{
			add(t[i][1],t[i][0],t[i][2]);
		//	add1(b,a,c);
		}
		o.push(1);
		vis[1]=1;
		dis[1]=0;
		while(!o.empty())
		{
			int s=o.front();
			o.pop();
			vis[s]=0;
			for(int i=head[s];i;i=e[i].to)
			{
				int vi=e[i].v;
				if(dis[vi]>dis[s]+e[i].w)
				{
					dis[vi]=dis[s]+e[i].w;
					if(!vis[vi])
					{
						vis[vi]=1;
						o.push(vi);
					}
				}
			}
		}
		for(int i=2;i<=p;i++)
		{
			ans+=dis[i];
		}	
		memset(e,0,sizeof(e));
			cout<<ans<<endl;
	}
}

K - Candies

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值