【POJ 1797 Heavy Transportation】



方法有

1.dijikstra  (原来的变形,更改初始化条件和更新条件,每一项记录当前从第一点到该点的最大承重值)


#include<iostream>
using namespace std;
#include<algorithm>
#include<memory.h>


int v[1005];
int mark[1005];
int graph[1005][1005];
int n;

int getMax()
{
	int max=-1;
	int temp=0;
	for(int i=0;i<n;i++)
	{
		if(v[i]>max&&mark[i]==0)
		{
			temp=i;
			max=v[i];
		}
	}
	return temp;
}

void dijikstra()
{
	for(int i=0;i<n;i++)
	{
		v[i]=graph[0][i];
	}
	for(int i=0;i<n;i++)
	{
		int max=getMax();
		mark[max]=1;
		for(int k=0;k<n;k++)
		{
			if(!mark[k]&&v[k]<min(graph[max][k],v[max]))
			{
				v[k]=min(graph[max][k],v[max]);
			}
		}
	}
}

int main(void)
{
	int times;
	cin>>times;
	for(int i=1;i<=times;i++)
	{
		int m;
		cin>>n>>m;
		memset(mark,0,sizeof(mark[0])*n);
		
		for(int k=0;k<n;k++)
		{
			memset(graph[k],0,sizeof(graph[k][0])*n);
		}
		for(int k=0;k<m;k++)
		{
			int a1,a2,w1;
			cin>>a1>>a2>>w1;
			graph[a1-1][a2-1]=w1;
			graph[a2-1][a1-1]=w1;
		}
		dijikstra();
		cout<<"Scenario #"<<i<<":"<<endl;
		cout<<v[n-1]<<endl<<endl;
	}
	return 0;
 } 

2.Floyd (原来的变形,更改更新条件,但是TLE了)


/*TLE*/

#include<iostream>
using namespace std;
#include<algorithm>
#include<memory.h>


int graph[1005][1005];
int n;

void floyd()
{
	for(int i=0;i<n;i++)
	{
		for(int k=0;k<n;k++)
		{
			for(int t=0;t<n;t++)
			{
				graph[k][t]=max(graph[k][t],min(graph[k][i],graph[i][t]));
			}
		}
	}
} 


int main(void)
{
	int times;
	cin>>times;
	for(int i=1;i<=times;i++)
	{
		int m;
		cin>>n>>m;
		for(int k=0;k<n;k++)
		{
			memset(graph[k],0,sizeof(graph[k][0])*n);
		}
		for(int k=0;k<m;k++)
		{
			int a1,a2,w1;
			cin>>a1>>a2>>w1;
			graph[a1-1][a2-1]=w1;
			graph[a2-1][a1-1]=w1;
		}
		floyd();
		cout<<"Scenario #"<<i<<":"<<endl;
		cout<<graph[0][n-1]<<endl<<endl;
	}
	return 0;
}

3.dfs+回溯(但是TLE了)

#include<iostream>
/*TLE*/ 

using namespace std;
#include<queue>
#include<memory.h>

priority_queue<int,vector<int>,less<int> > pq;

vector<int> str[1100];
vector<int> weight[1100];
int n;

void dfs(int t,int min,bool mark[])
{
	if(t==n-1)
	{
		pq.push(min);
		return;
	}
	for(int i=0;i<str[t].size();i++)
	{
		int temp=str[t][i];
		
		if(mark[temp]==0)
		{
			mark[temp]=1;
			int tempmin=min;
			
			if(weight[t][i]<min)
			{
				tempmin=weight[t][i];
			}
			dfs(temp,tempmin,mark);
			mark[temp]=0;
		}
	}
 } 
 
 
 
int main(void)
{
	int time;
	cin>>time;
	for(int i=1;i<=time;i++)
	{
		pq.empty();
		bool mark[1005];
		mark[0]=1;
		int min=10000005;
		int m;
		cin>>n>>m;
		memset(mark,0,sizeof(mark[0])*n);
		for(int p=0;p<n;p++)
		{
			str[p].clear();  //清空当前元素 
			weight[p].clear();
		}
		for(int k=0;k<m;k++)
		{
			int a1,a2,w1;
			cin>>a1>>a2>>w1;
			str[a1-1].push_back(a2-1);
			str[a2-1].push_back(a1-1);
			weight[a1-1].push_back(w1);
			weight[a2-1].push_back(w1);
		}
		dfs(0,min,mark);
		cout<<"Scenario #"<<i<<":"<<endl;
		cout<<pq.top()<<endl;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值