poj之旅——3259,3268

原创 2016年05月30日 12:38:43

基础模板题。

3259:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxm 10000
#define INF 0x3f3f3f3f
int d[maxm];
int cnt,n,m,w;
struct Edge{
	int from,to,dist;
}e[maxm];
void addedge(int u,int v,int w){
	e[cnt].from=u;
	e[cnt].to=v;
	e[cnt++].dist=w;
}
bool find_negative_loop(){
	memset(d,0,sizeof(d));
	for (int i=0;i<n;i++)
		for (int j=0;j<cnt;j++){
			Edge t=e[j];
			if (d[t.to]>d[t.from]+t.dist){
				d[t.to]=d[t.from]+t.dist;
				if (i==n-1)return true;
			}
		}
    return false;		
}
int main(){
	int T;
	scanf("%d",&T);
	while (T--){
		scanf("%d%d%d",&n,&m,&w);
		int u,v,cost;
		cnt=0;
		for (int i=0;i<m;i++){
			scanf("%d%d%d",&u,&v,&cost);
			u--;v--;
			addedge(u,v,cost);
			addedge(v,u,cost);
		}
		for (int i=0;i<w;i++){
			scanf("%d%d%d",&u,&v,&cost);
			u--;v--;
			addedge(u,v,-cost);
		}
		if (find_negative_loop())printf("YES\n");
			else printf("NO\n");
	}
	return 0;
}

3268:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
#define maxn 10000
#define INF 0x7f7f7f7f
using namespace std;
int n,m,id;
struct Edge{
	int from,to,dist;
	Edge(int from,int to,int dist):from(from),to(to),dist(dist){}
};
struct HeapNode{
	int d,u;
	bool operator < (HeapNode rhs)const{
		return d>rhs.d;
	}
	HeapNode(int d,int u):d(d),u(u){};
};
struct Dijkstra{
	int n,m;
	vector<Edge> edges;
	vector<int> G[maxn];
	bool done[maxn];
	int d[maxn];
	int p[maxn];
	void init (int n){
		this->n=n;
		for (int i=0;i<n;i++) G[i].clear();
		edges.clear();
	}
	void addedge(int from,int to,int dist){
		edges.push_back(Edge(from,to,dist));
		m=edges.size();
		G[from].push_back(m-1);
	}
	void dijsktra(int s){
		priority_queue<HeapNode> Q;
		for (int i=0;i<n;i++) d[i]=INF;
		d[s]=0;
		memset(done,0,sizeof(done));
		Q.push(HeapNode(0,s));
		while (!Q.empty()){
			HeapNode x=Q.top();Q.pop();
			int u=x.u;
			if (done[u])continue;
			done[u]=true;
			for (int i=0;i<G[u].size();i++){
				Edge e=edges[G[u][i]];
				if (d[e.to]>d[u]+e.dist){
					d[e.to]=d[u]+e.dist;
					p[e.to]=G[u][i];
					Q.push(HeapNode(d[e.to],e.to));
				}
			}
	    }
	}
}G1,G2;
int main(){
	scanf("%d%d%d",&n,&m,&id);
	id--;
	G1.init(n);G2.init(n);
	for (int i=0;i<m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		u--;v--;
		G1.addedge(u,v,w);
		G2.addedge(v,u,w);
	}
	G1.dijsktra(id);
	G2.dijsktra(id);
	int ans=G1.d[0]+G2.d[0];
	for (int i=1;i<n;i++)ans=max(ans,G1.d[i]+G2.d[i]);
	printf("%d",ans);
	return 0;
}

版权声明:本文为博主原创文章,但可以随意转载

相关文章推荐

《挑战程序设计竞赛》2.5.1 最短路 AOJ0189 2249 2200 POJ3255 2139 3259 3268(5)

POJ2139http://poj.org/problem?id=2139题意奶牛们最近要拍电影了…… 1、若两个的奶牛一起工作则,他们相互的度(degrees)为; 2、若两只奶牛a、b不一起工...

poj3268——Silver Cow Party(最短路+godv之力)

DescriptionOne cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend...

poj3259——Wormholes(Eellman-Ford算法)

DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing wormholes....

POJ3259——Wormholes

题目链接:http://poj.org/problem?id=3259 Wormholes 题目大意:给你n个点,m条双向联通的权值为正的路,和w条单向联通权值为负的路。让你判断是否存在负环。...

带负权的最短路bellman_ford——POJ 3259 Wormholes题解

Description While exploring his many farms, Farmer John has discovered a number of amazing wormho...

POJ 3259 Wormholes【bellman_ford判断负环——基础入门题】

链接: http://poj.org/problem?id=3259 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#pr...

poj-3259——bellmanford

题意很明显:判断是否有负权回路。 bellman_ford的算法实现过程: 首先明确一点 迄今 还不知道 判断完是否有负权后 怎么计算最短路。——有负权 没有最短路。无负权,dis中的最小距离即是...

POJ3259-Wormholes【Bellman】

  • 2011年07月30日 01:53
  • 8KB
  • 下载

POJ - 3268 Silver Cow Party解题报告(dijkstra分别求单源起点和单源终点的最短路)

题目大意:题目大意:给你一个有向图,n(1000)个点m(100,000)条路径让你求出各个点到x号点再回到他自己的最短路径的最大值。分析:用dijkstra算法可以分别求出各个点到x号点的最短路和x...

poj3268 - Silver Cow Party

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj之旅——3259,3268
举报原因:
原因补充:

(最多只允许输入30个字)