暑期集训 DAY2


-----------------------

UPD2:

需要注意的:

1.重边

2.标号从0开始还是从1开始

3.循环初始化


----------

UPD1: 是我傻了。。每次更新完length(最短距离)之后应在所有未标记的结点中寻找下一个标记点,而不是(像我之前)在当前标记点的相邻的点中找,不然,不到南墙不回头,碰到南墙就断头……

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
const int MAXN = 100010;
struct station {
	int id;
	int value;
};
vector<station> point[MAXN];
string sta[10010];
int length[MAXN];
bool vist[MAXN];
int m, n;

int distance1(string s1, string s2)
{
	int cont = 0, let[26] = { 0 };
	for (int i = 0; i < s1.length(); i++)
	{
		if (s1[i] < 'a')
			s1[i] += 32;
		let[s1[i] - 'a']++;
	}
	for (int i = 0; i < s2.length(); i++)
	{
		if (s2[i] < 'a')
			s2[i] += 32;
		if (let[s2[i] - 'a'])
		{
			cont++;
			let[s2[i] - 'a'] = 0;
		}
	}
	return cont;
}


void link(int p1, int p2, int dist)
{
	station s;
	s.id = p2;
	s.value = dist;
	point[p1].push_back(s);
}

int dijkstra(int start, int end)
{
	memset(length, 0x7f, sizeof(length));
	memset(vist, 0, sizeof(vist));
	int now = start;
	int temp;
	length[now] = 0;                        //shao jia le  zhe ge  
	for (int k = 0; k<m; k++)
	//while(1)
	{
		int rnow;
		int value = 0x7f;

		for (int i = 0; i < point[now].size(); i++)
		{
			rnow = point[now][i].id;
			if (vist[rnow])
				continue;
			if (length[now] + point[now][i].value < length[rnow])
				length[rnow] = length[now] + point[now][i].value;
		}
		vist[now] = 1;
		for(int i=1;i<=m;i++)
			if (length[i] < value && !vist[i])
			{
				value = length[i];
				temp = i;
				//flag = 1;
			}
		now=temp;
		/*if (flag)
		{
			//front = now;
			now = temp;
		}
		else
		{
			int i = 0;
			while (vist[i])
				i++;
			now = i;

		//	vist[front] = 0;
			//now = front;
			//cout << front<<" "<< now<<" " ;  
		}*/
		if (now == end)
			break;
	}
	return length[end];
}
int main()
{

	while (cin >> m >> n)
	{
		for (int i = 1; i <= m; i++)
			cin >> sta[i];
		for (int i = 0; i < n; i++)
		{
			int p1, p2, dist;
			cin >> p1 >> p2;
			dist = distance1(sta[p1], sta[p2]);
			link(p1, p2, dist);
			link(p2, p1, dist);
		}

		int start, end;
		cin >> start >> end;
		cout << dijkstra(start, end) << endl;

		for (int i = 1; i <= m; i++)
			point[i].clear();
	}
	return 0;

}

-----------------------------------------------------------------------------------------------

http://codeforces.com/gym/101343/problem/C

dijkstra求最短路  

无法处理“断头路”



               错误1    T           遇到了死循环

//#include<iostream>
//#include<vector>
//#include<string>
//#include<cstring>
//using namespace std;
//const int MAXN = 100010;
//struct station {
// int id;
// int value;
//};
//vector<station> point[MAXN];
//string sta[10010];
//int length[MAXN];
//bool vist[MAXN];
//int m, n;
//
//int distance(string s1, string s2)
//{
// int cont = 0, let[26] = { 0 };
// for (int i = 0; i < s1.length(); i++)
// {
// if (s1[i] < 'a')
// s1[i] += 32;
// let[s1[i] - 'a']++;
// }
// for (int i = 0; i < s2.length(); i++)
// {
// if (s2[i] < 'a')
// s2[i] += 32;
// if (let[s2[i] - 'a'])
// {
// cont++;
// let[s2[i] - 'a'] = 0;
// }
// }
// return cont;
//}
//
//
//void link(int p1, int p2, int dist)
//{
// station s;
// s.id = p2;
// s.value = dist;
// point[p1].push_back(s);
//}
//
//int dijkstra(int start, int end)
//{
// memset(length, 0x7f, sizeof(length));
// memset(vist, 0, sizeof(vist));
// station temp;
// int now = start;
// length[now] = 0;   //shao jia le  zhe ge
// int round = 0;
// while (round++ <= m )
// {
// temp.value = 0x7f;
// for (int i = 0; i < point[now].size(); i++)
// {
// int rnow= point[now][i].id;
// if (vist[rnow])
// continue;
// if (length[now] + point[now][i].value < length[rnow])
// length[rnow] = length[now] + point[now][i].value;
// if (length[rnow] < temp.value)
// temp = point[now][i];
// }
// vist[now] = 1;
// now = temp.id;
// if (now == end)
// break;
// }
// return length[end];
//}
//int main()
//{
//
// while (cin >> m >> n)
// {
// for (int i = 1; i <= m; i++)
// cin >> sta[i];
// for (int i = 0; i < n; i++)
// {
// int p1, p2, dist;
// cin >> p1 >> p2;
// dist = distance(sta[p1], sta[p2]);
// link(p1, p2, dist);
// link(p2, p1, dist);
// }
//
// int start, end;
// cin >> start >> end;
// cout << dijkstra(start, end) << endl;
//
// for (int i = 1; i <= m; i++)
// point[i].clear();
// }
// return 0;
//
//}





                               固定循环次数                 同一组数据WA



//#include<iostream>
//#include<vector>
//#include<string>
//#include<cstring>
//using namespace std;
//const int MAXN = 100010;
//struct station {
// int id;
// int value;
//};
//vector<station> point[MAXN];
//string sta[10010];
//int length[MAXN];
//bool vist[MAXN];
//int m, n;
//
//int distance(string s1, string s2)
//{
// int cont = 0, let[26] = { 0 };
// for (int i = 0; i < s1.length(); i++)
// {
// if (s1[i] < 'a')
// s1[i] += 32;
// let[s1[i] - 'a']++;
// }
// for (int i = 0; i < s2.length(); i++)
// {
// if (s2[i] < 'a')
// s2[i] += 32;
// if (let[s2[i] - 'a'])
// {
// cont++;
// let[s2[i] - 'a'] = 0;
// }
// }
// return cont;
//}
//
//
//void link(int p1, int p2, int dist)
//{
// station s;
// s.id = p2;
// s.value = dist;
// point[p1].push_back(s);
//}
//
//int dijkstra(int start, int end)
//{
// memset(length, 0x7f, sizeof(length));
// memset(vist, 0, sizeof(vist));
// int now = start;
// int temp;
// length[now] = 0;   //shao jia le  zhe ge
// for (int k = 0; k<m; k++)
// {
// int value = 0x7f;
// for (int i = 0; i < point[now].size(); i++)
// {
// int rnow = point[now][i].id;
// if (vist[rnow])
// continue;
// if (length[now] + point[now][i].value < length[rnow])
// length[rnow] = length[now] + point[now][i].value;
// if (length[rnow] < value)
// {
// value = length[rnow];
// temp = point[now][i].id;
// }
// }
// vist[now] = 1;
// now = temp;
// // if (now == end)
// // break;
// }
// return length[end];
//}
//int main()
//{
//
// while (cin >> m >> n)
// {
// for (int i = 1; i <= m; i++)
// cin >> sta[i];
// for (int i = 0; i < n; i++)
// {
// int p1, p2, dist;
// cin >> p1 >> p2;
// dist = distance(sta[p1], sta[p2]);
// link(p1, p2, dist);
// link(p2, p1, dist);
// }
//
// int start, end;
// cin >> start >> end;
// cout << dijkstra(start, end) << endl;
//
// for (int i = 1; i <= m; i++)
// point[i].clear();
// }
// return 0;
//
//}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值